C++为什么LLONG_MIN == -LLONG_MIN

1 c++ signed integer-overflow long-long

在C++中如果我这样做:

__int64 var = LLONG_MIN;
__int64 var2 = -var;
cout << "var: "<< var << endl;
cout << "var2: "<< var2 << endl;
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

var: -9223372036854775808
var2: -9223372036854775808
Run Code Online (Sandbox Code Playgroud)

涵盖此标准的标准部分是什么?我假设它是有符号整数溢出.这是使用g ++(GCC)4.7.2编译的.

我有一个减法函数,我正在写一个添加函数,我想我可以这样做: add( someobj &obj, long long num ) { subtract( obj, -num ); }.我认为如果不是LLONG_MIN那会有用.

sya*_*yam 5

它确实是整数溢出,是两个补码的人工制品.

在您的实现,LLONG_MIN-9223372036854775808这是0x8000000000000000十六进制(因为它更容易看到发生了什么位我会用这个十六进制表示).

当你-LLONG_MIN在一个使用二进制补码的系统上进行计算时,你首先做一个按位而不是(让步0x7FFFFFFFFFFFFFFF == LLONG_MAX),然后加1,它会溢出有符号整数并返回0x8000000000000000 == LLONG_MIN.

请注意,有符号整数溢出是未定义行为,因此无法保证它在每个C++实现上都表现一致.