为什么1不大于-0x80000000

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

assert(1 > -0x80000000); 

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


我很感激所提供的一些答案。 但C ++标准是否定义常量需要存储在32位整数中? 为什么编译器没有认识到80000000不适合32位整数并且使用64位呢? 我的意思是,最大的32位int可以是0x7FFFFFFF。 0x80000000明显大于那个。 为什么编译器仍然使用32位呢?

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

解决此问题的一种方法是使用您知道它可能能够正确表示和保留您的值的类型,这意味着您的表达式可以像这样修复

 assert(1 > -0x80000000L); 

要么

 assert(1 > -0x80000000LL); 

这基本上是关于在C ++中使用标准后缀来表示所谓的整数表达式。

C ++中整数类型的唯一3个标准后缀是ulll ,以及与它们的小写对应物相同的大写变体; ULLL