C++ Why does LLONG_MIN == -LLONG_MIN

C++ Why does LLONG_MIN == -LLONG_MIN

本文关键字:MIN -LLONG LLONG Why does C++      更新时间:2023-10-16

如果我这样做C++

__int64 var = LLONG_MIN;
__int64 var2 = -var;
cout << "var: "<< var << endl;
cout << "var2: "<< var2 << endl;

我得到的输出是:

var: -9223372036854775808
var2: -9223372036854775808

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

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

它确实是整数溢出,并且是 2 补码的人工制品。

在您的实现中,LLONG_MIN -9223372036854775808以十六进制0x8000000000000000(我将使用此十六进制表示法,因为它更容易看到位会发生什么)。

当你在使用 2 补码的系统上计算-LLONG_MIN时,在引擎盖下你首先做一个按位 not(产生 0x7FFFFFFFFFFFFFFF == LLONG_MAX ),然后加上 1,这会溢出有符号整数并返回 0x8000000000000000 == LLONG_MIN

请注意,有符号整数溢出是未定义的行为,因此不能保证它在每次C++实现上的行为一致。

虽然另一个答案是正确的,但我认为它并不能解释这一点的直观方面:

LLONG_MIN ==  -2^63      == -9223372036854775808
LLONG_MAX ==   2^63 - 1  ==  9223372036854775807

我试图考虑使用 LLONG_MIN 作为某些东西的特例,但后来我想起使用 c++ 有符号整数类型,最小值总是比最大值比最大值更远 0 1(有趣的是,它们中的每一个,从字节到双精度,都以 -...8+...7 结尾!

所以,我很好奇,如果你否定最低值会发生什么,因为在正领域没有等价物;而且,唉,它被算作整数溢出(-9223372036854775808 == 9223372036854775808 > 9223372036854775807),因此它溢出了1(9223372036854775807 + 1),导致我们回到...... -9223372036854775808


法典:

#include <iostream>
#include <climits>
using namespace std;
int main() {
  long long l1 = LLONG_MIN;
  long long l2 = -l1; //Equivalent to l1.
  long long l3 = l1 - 1;
  long long l4 = l3 + 1;
  cout << l1 << "n";
  cout << l2 << "n";
  cout << l3 << "n";
  cout << l4 << "n";
  return 0;
}

输出:

-9223372036854775808
-9223372036854775808
 9223372036854775807
-9223372036854775808