C++;为什么LLONG_MIN==-LLONG_MIN 在C++中,如果我这样做: __int64 var = LLONG_MIN; __int64 var2 = -var; cout << "var: "<< var << endl; cout << "var2: "<< var2 << endl;

C++;为什么LLONG_MIN==-LLONG_MIN 在C++中,如果我这样做: __int64 var = LLONG_MIN; __int64 var2 = -var; cout << "var: "<< var << endl; cout << "var2: "<< var2 << endl;,c++,signed,integer-overflow,long-long,C++,Signed,Integer Overflow,Long Long,标准中涵盖这一点的部分是什么?我想这是有符号整数溢出。这是使用g++(GCC)4.7.2编译的 我有一个减法函数,我正在写一个加法函数,我想我可以这样做: add(someobj&obj,long-long-num){subtract(obj,-num);}。我认为如果不是因为LLONG_MIN,这可能会起作用。这确实是整数溢出,而且是一个人工制品 在您的实现中,LLONG_MIN是-9223372036854775808,它是十六进制的0x80000000000000(我将使用这种十六进制表示

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

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

这确实是整数溢出,而且是一个人工制品

在您的实现中,
LLONG_MIN
-9223372036854775808
,它是十六进制的
0x80000000000000
(我将使用这种十六进制表示法,因为更容易看到位发生了什么)

在使用二的补码的系统上计算
-LLONG_MIN
时,首先在引擎盖下生成一个按位not(生成
0x7FFFFFFFFFFFFFFF==LLONG_MAX
),然后添加1,该值溢出有符号整数并返回
0x80000000000000==LLONG_MIN


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

< P>。而另一个答案是正确的,我认为它不能解释这方面的直观方面:

LLONG_MIN ==  -2^63      == -9223372036854775808
LLONG_MAX ==   2^63 - 1  ==  9223372036854775807
我试图用LangLymin作为一个特殊的情况,但是我记得用C++符号积分类型,最低值总是比最值高1(0,每一个,从一个字节到另一个,在<代码>结束……8 < /代码>和<代码> +…7个/代码>!) 所以,我当时很好奇,如果你要否定最低的值,会发生什么,因为在积极的领域里,它没有等价物;唉,它被算作整数溢出(
9223372036854775808==9223372036854775808>9223372036854775807
),因此它溢出1(
9223372036854775807+1
),让我们回到<代码>-9223372036854775808


代码:


这确实是整数溢出,我认为标准中控制这一点的部分是从C继承的standard@seheIIRC有符号整数溢出是UB。@syam我也记得。但是,这没有什么区别:是否为UB也受该标准章节的管辖。:)谢谢您对我如何使用已定义的行为实现添加带符号的数字和环绕溢出有何建议?我必须向对象添加一个64位整数。如果它溢出,我更喜欢它环绕而不是未定义的行为。
LLONG_MIN ==  -2^63      == -9223372036854775808
LLONG_MAX ==   2^63 - 1  ==  9223372036854775807
#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