C语言条件判断中的类型转换:a+b会转换为有符号还是无符号类型?
问题结论
a + b的运算结果为无符号类型(unsigned int)- 该转换规则是C标准明确规定的,所有符合规范的编译器必须遵守,不属于编译器自定义行为。
规则说明
C语言对不同类型整数的二元运算定义了「通常算术转换(Usual Arithmetic Conversions)」规则,其中针对同转换等级的有符号和无符号整数操作数,明确要求:
如果无符号整数类型的转换等级大于或等于有符号整数类型的转换等级,那么有符号整数类型的操作数会被隐式转换为无符号整数类型。
在你的示例中,a是unsigned int类型,b是int类型,二者的转换等级完全相等,因此b会先被转换为unsigned int,再和a执行加法运算,最终结果自然也是unsigned int类型。
补充验证(以32位平台为例)
unsigned a = -5实际存储的值为2^32 - 5 = 4294967291int b = 5转换为unsigned int后值为5- 二者相加结果为
4294967291 + 5 = 4294967296,按无符号整数模2^32规则取模后结果为0 - 后续判断
0 <= -1时,-1会同样被转换为unsigned int值4294967295,因此判断结果为真。
内容的提问来源于stack exchange,提问作者Anton Golovenko
相关产品推荐
相关产品推荐

