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

本文探讨了在C90标准下,编译器处理整数比较时出现的异常情况。例如,-2147483648小于2147483647的结果为false,原因是编译器将2147483648视为无符号整型,导致在比较时出现问题。同时,当将-2147483648赋值给变量后再进行比较,则会按照带符号整型正确判断。文章深入解析了编译器处理整数常量和变量的内部机制,并提供了理解这一现象的见解。
摘要由CSDN通过智能技术生成

在这里插入图片描述

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Every DAV inci

小辣鸡一枚,不求打赏啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值