C++ Why does LLONG_MIN == -LLONG_MIN
C++ Why does LLONG_MIN == -LLONG_MIN
如果我这样做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
- 如何使用std::min和std::less返回对象
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- 关于 std::min, std::max 中的比较运算符的混淆
- 使用 CImg 库的 std::min 和 std::max 的编译问题
- 为什么将 1 添加到 numeric_limits<float>::min() 返回 1?
- 在儿童的特定情况下,向下渗透MIN二进制堆失败
- 在f2c.h文件中定义min()max()宏时出错
- 如何解决g++问题"internal compiler error: Illegal instruction min() _GLIBCXX_USE_NOEXCEPT { return __FLT_MI
- 第 5 行:字符 54:错误:调用"min(int,std::__cxx11::basic_string<char>::size_type)"没有匹配函数
- 如何使用函数std::min()来计算最小值
- 在函数 'int main(int, char**) 中,没有声明 'MIN'
- 将迭代器值与 std::min 一起固定到 end()
- C++是否在 std::min 和 std::max 下标准化 std::optional 的行为?
- c++ 中 std::min 的效率
- 当摆脱模偏差时,min = -upper_bound % upper_bound; // 如何工作?
- std :: min-设计考虑
- 如何在 OpenACC 中并行化内部具有"min"功能的循环
- 使用 std::min "no matching function for call to ‘min(<brace-enclosed initializer list>)’"时出错
- 使用`std :: min`作为算法参数
- std::min 与参数包