虽然另一个答案是正确的,但我认为它不能解释这个直观的一面:
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