为什么它在-2147483648和(int)-2147483648之间有所不同

lic*_*nbo 8 c++ integer overflow

当我在使用GCC of MinGW编译的Windows7 x64下运行以下代码时,结果似乎是下溢的:

cout<<-2147483648 ;    //Output: 2147483648
Run Code Online (Sandbox Code Playgroud)

但是当我将它分配给整数变量时,或者只是简单地将其转换为int类型:

cout<<(int)-2147483648 ; //Output: -2147483648 
Run Code Online (Sandbox Code Playgroud)

那么,我的代码的先前版本出了什么问题?我不是int类型吗?或整数的下界究竟是什么?非常感谢.

小智 11

2147483648不适合系统中的int或long,因此它被视为unsigned long类型的常量.(编辑:正如ouah在评论中指出的那样,它是标准C++中的未定义行为,但是你的编译器接受它作为扩展.)可以否定无符号整数值,但会产生另一个无符号整数值,绝不是负数.否定2147483648UL产生2147483648UL(假设,在您的系统上,无符号长整数是32位类型).

转换它以int产生实现定义的结果,通常是您看到的结果,但不一定.您可以通过编写-2147483647 - 1来获得所需的结果而无需任何转换.

  • `2147483648`是类型为`long long`而不是`unsigned long`的常量.未加十进制的十进制常量是`int`,`long`或`long long`类型. (2认同)
  • 对于C++,如果我们采用C++ 98,它在32位系统中是未定义的行为:*(2.13.1p2)"如果它是十进制且没有后缀,则它具有这些类型中的第一个,其值可以表示:int,long int;如果值不能表示为long int,则行为未定义."* (2认同)