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很有帮助!推荐一下~
作者:Evinci
出处:https://www.cnblogs.com/evinci/p/17124012.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库