C语言中`Variable > -1`求值规则及32位架构下结果差异疑问
问题解答
一、Variable > -1的求值逻辑
在C语言中,当无符号类型变量和-1(int类型常量)进行比较时,会触发寻常算术转换,核心规则如下:
- 先判断int类型的取值范围是否能完全包含该无符号类型的所有可能值:
- 如果能,无符号变量会被转换为int类型,再和
-1做比较; - 如果不能,int类型的
-1会被转换为对应的无符号类型,再进行比较。
- 如果能,无符号变量会被转换为int类型,再和
二、32位架构下两个分支结果不同的原因
先明确32位环境下的关键类型范围:
int是32位,取值范围为-2^31到2^31-1(即-2147483648至2147483647);uint16_t是16位无符号,取值范围0到65535;uint32_t是32位无符号,取值范围0到2^32-1(即0至4294967295)。
第一个条件peter > -1
uint16_t的最大值65535远小于int的最大值2147483647,满足“int能包含无符号类型所有值”的条件,因此peter会被转换为int类型,值为8。此时比较的是8 > -1,结果为真,进入分支。
第二个条件peter2 > -1
uint32_t的最大值4294967295超出了int的取值范围(int最大只能到2147483647),所以触发“int转无符号类型”的规则:int类型的-1被转换为uint32_t类型时,二进制全1位会被解释为无符号的最大值4294967295。此时比较的是8 > 4294967295,结果为假,不进入分支。
内容的提问来源于stack exchange,提问作者Niclas
相关产品推荐
相关产品推荐

