This question already has answers here:
Why is 0 < -0x80000000?

(6个答案)


5年前关闭。




为什么1不大于-0x80000000。我知道它与溢出有关。但是有人可以解释为什么吗? 0x80000000不是一个常数,我认为是吗?
assert(1 > -0x80000000);

断言在C++中触发。这是为什么?

感谢您提供的一些答案。但是C++标准是否定义了常数需要存储在32位整数中?为何编译器不认识到80000000不适合32位整数,而使用64位呢?我的意思是,最大的32位整数可以是0x7FFFFFFF。 0x80000000明显大于该值。为什么编译器仍然为此使用32位?

最佳答案

根据C和C++标准,-0x80000000不是整数常量。这是一个表达式,类似于3 + 5。在这种情况下,它是由否定运算符操作的常量0x80000000。对于具有32位int的编译器,0x80000000不能表示为int,但是可以表示为unsigned int。但是,无符号整数的取反(古怪地)是在无符号上下文中完成的。因此,这里的否定实际上没有效果。

10-05 18:56