-2147483648 < 2147483647,为什么有的编译器运行结果为false?

这个问题本质是 unsigned 和 signed是无法正确比较的。
“-“是一个一元取反操作符。
字面量情况下,取反操作 和后面数字 是分开处理的。
先以一个临时变量形式将数字存储,再对其进行取负操作。

C90规定,默认情况下,[231 , 232 - 1]区间是unsigned类型
2147483648 显然是在这个范围内,所以作为一个无符号临时变量存储在内存里。
至于前面的取负操作,无符号取负依然是无符号数。(取负过程是,机器码中 各位取反,然后将取反后的结果 + 1。这个结果作为unsigned类型临时变量存储,不会更改变量类型)

最后,逻辑运算符左操作数是无符号数,右操作数是有符号整数。这种情况下,无法保证运算结果的正确性。

C99(包含)之后的版本取消了 默认的unsigned类型,只有 int,long long,unsigned long long这三种默认数据类型。避免了以上问题

参考:

编译器警告(等级 2)C4146

来自 https://learn.microsoft.com/zh-cn/cpp/error-messages/compiler-warnings/compiler-warning-level-2-c4146?view=msvc-170

error C4146: 一元负运算符应用于无符号类型,结果仍为无符号类型

来自 https://blog.youkuaiyun.com/liuhhaiffeng/article/details/53991071

一元加号和非运算符:+ 和 - ,一元取反运算符,一元取负运算符
来自 https://learn.microsoft.com/zh-cn/cpp/cpp/unary-plus-and-negation-operators-plus-and?view=msvc-170

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值