C++ 中 1<<31 的结果不明确
Ambiguous result for 1<<31 in C++
为什么当我们运行下面的代码时1<<31
输出18446744071562067968
?
#include<iostream>
using namespace std;
int main(){
unsigned long long int i = 1<<31;
cout<<i; // this prints 18446744071562067968
}
1 是 signed int
,在您的系统上是 32 位。 1 << 31
导致溢出,并且是一个负数 (0x80000000
)。这在转换为 64 位 unsigned long long
时符号扩展为 64 位,然后再转换为 ULL 值,即 0xFFFFFFFF80000000
,或您看到的大十进制数。
为什么当我们运行下面的代码时1<<31
输出18446744071562067968
?
#include<iostream>
using namespace std;
int main(){
unsigned long long int i = 1<<31;
cout<<i; // this prints 18446744071562067968
}
1 是 signed int
,在您的系统上是 32 位。 1 << 31
导致溢出,并且是一个负数 (0x80000000
)。这在转换为 64 位 unsigned long long
时符号扩展为 64 位,然后再转换为 ULL 值,即 0xFFFFFFFF80000000
,或您看到的大十进制数。