这个问题本质是 unsigned 和 signed是无法正确比较的。
“-“是一个一元取反操作符。
字面量情况下,取反操作 和后面数字 是分开处理的。
先以一个临时变量形式将数字存储,再对其进行取负操作。
C90规定,默认情况下,[231 , 232 - 1]区间是unsigned类型
2147483648 显然是在这个范围内,所以作为一个无符号临时变量存储在内存里。
至于前面的取负操作,无符号取负依然是无符号数。(取负过程是,机器码中 各位取反,然后将取反后的结果 + 1。这个结果作为unsigned类型临时变量存储,不会更改变量类型)
最后,逻辑运算符左操作数是无符号数,右操作数是有符号整数。这种情况下,无法保证运算结果的正确性。
C99(包含)之后的版本取消了 默认的unsigned类型,只有 int,long long,unsigned long long这三种默认数据类型。避免了以上问题
参考:
编译器警告(等级 2)C4146
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