为何GCC开启-Wconversion时3个及以上unsigned char算术运算会触发警告?
原因说明
根因是C语言的整数提升规则
C语言标准明确规定:所有宽度小于int的整数类型(比如uint8_t即unsigned char,x86-64平台下int占4字节,远大于uint8_t的1字节)在参与算术运算前,会先被隐式提升为int类型;仅当int无法容纳该类型的全部取值时,才会提升为unsigned int。因此不管是2个还是3个uint8_t做加法,每一步运算的结果实际都是int类型。两个
uint8_t相加不告警是GCC的特殊处理-Wconversion警告的触发逻辑由编译器自行实现,GCC对两个uint8_t相加的场景做了专门优化:静态分析阶段可以准确识别二元uint8_t加法的结果范围,判定为开发者常见的合法使用场景,默认跳过警告;而3个及以上uint8_t的运算属于多步复合运算,GCC的静态范围分析不会深入推导复合运算的最终取值范围,只要检测到int类型赋值给宽度更小的uint8_t类型,就会触发可能丢失数值的警告。该表现属于GCC的警告规则实现差异,所以Clang 12.0.1不会出现相同警告。消除警告的方案
只需要对运算结果做显式强制类型转换,告知编译器你明确知晓该类型转换的行为,即可消除警告:
uint8_t k = (uint8_t)(a + b + c);
内容的提问来源于stack exchange,提问作者abumandour
相关产品推荐
相关产品推荐

