为什么1不大于-0x80000000

Neg*_*ero 5 c c++

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

assert(1 > -0x80000000);
Run Code Online (Sandbox Code Playgroud)

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


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

Sne*_*tel 13

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

  • @CommuSoft:没有事实'int`是32位,依赖于该假设的程序是不可移植的.在你关心的机器上运行程序是你的工作,而不是编译器. (2认同)