当我们运行以下代码时,为什么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
,或您看到的大十进制数。