C90标准中无符号数与有符号数的比较以及原因解释(关系式-2147483648<2147483647结果为假)

在这里插入图片描述

在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很有帮助!推荐一下~

猜你喜欢

转载自blog.csdn.net/ahahayaa/article/details/120857289