在C90标准下进行编译并执行:
gcc -o num -g num.c
可以看到如上结果,第一个结果看起来非常不符合常识为什么-2147483648<2147483647
得到的结果是0即false,而对 i 赋值,在进行i < 2147483648
的比较运算得到的结果却是1即true呢?
在C90标准下,编译器在处理常量时,会按照int_t(int、long)、uint(unsigned int、unsigned long)、int64(long long)、uint64_t(unsigned long long)
的顺序确定数据类型,0~pow(2,31)-1
为32位带符号整数,pow(2,31)~pow(2,32)-1
位32为无符号整型,pow(2,32)~pow(2,63)-1
为64位带符号整型,pow(2,63)~pow(2,64)-1
为64位无符号整型。
编译器对c表达式-2147483648<2147483647
编译时,将-2147483648
分成两部分处理。
先将2147483648==pow(2,31)
看成无符号整型,其机器数为0x8000 0000
,然后,对其取负(按位取反,末尾加一),结果仍为0x8000 0000
,还是将其看成一个无符号整型,其值仍为 2147483648 。因而在处理条件表达式-2147483648<2147483647
时,实际上是将 2147483648 与 2147483647 按照无符号整型进行比较,显然结果为false。
编译器在处理int i = -2147483648
时进行了类型转换:
将-2147483648按带符号整数赋给变量 i ,其机器数还是0x8000 0000
,但是值为 -2147483648,执行了i < 2147483647
时,按照带符号整型来比较,结果是true。
对于-2147483647-1 < 2147483647:
编译器首先将2147483647 = pow(2,31)-1
看成带符号整型,然后对其取负,得到-2147483647,然后将其 -1,得到 -2147483648,与2147483647比较,得到结果为true。
link
这篇文章解释的很不错!!对于理解为什么-2147483648<2147483637结果为false很有帮助!推荐一下~