为什么1不大于-0x80000000。我知道它与溢出有关。但有人可以解释为什么吗?我认为是0x80000000不是常数吗?
assert(1 > -0x80000000);
断言在C ++中触发。那是为什么?
我很感激所提供的一些答案。但是C ++标准是否定义了常量需要存储在32位整数中?为什么编译器没有认识到80000000不适合32位整数并且使用64位呢?我的意思是,最大的32位int可以是0x7FFFFFFF。 0x80000000明显大于那个。为什么编译器仍然使用32位呢?
答案 0 :(得分:12)
根据C和C ++标准,-0x80000000
不是整数常量。它是一个表达式,如3 + 5
。在这种情况下,它是由否定运算符操作的常数0x80000000
。对于具有32位int
s的编译器,0x80000000
不能表示为int
,但可以表示为unsigned int
。但是,在无符号上下文中(否则)否定无符号整数。所以这里的否定实际上没有效果。
答案 1 :(得分:0)
解决此问题的一种方法是使用您知道它可能能够正确表示和保留您的值的类型,这意味着您的表达式可以像这样修复
assert(1 > -0x80000000L);
或
assert(1 > -0x80000000LL);
这基本上是关于在所谓的整数表达式中使用C ++中的标准后缀。
C ++中整数类型的唯一3个标准后缀是u
,l
和ll
,以及与它们的小写对应物相同的大写变体; U
,L
和LL
。