This question already has answers here:
Why is 0 < -0x80000000?
(6个答案)
5年前关闭。
为什么1不大于-0x80000000。我知道它与溢出有关。但是有人可以解释为什么吗? 0x80000000不是一个常数,我认为是吗?
断言在C++中触发。这是为什么?
感谢您提供的一些答案。但是C++标准是否定义了常数需要存储在32位整数中?为何编译器不认识到80000000不适合32位整数,而使用64位呢?我的意思是,最大的32位整数可以是0x7FFFFFFF。 0x80000000明显大于该值。为什么编译器仍然为此使用32位?
(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