C++中1 << 31的模糊结果

iro*_*man -2 c++ bit-manipulation bit-shift bitwise-operators c++11

当我们运行以下代码时,为什么1<<31打印18446744071562067968输出?

#include<iostream>
using namespace std;

int main(){
    unsigned long long int i = 1<<31;
    cout<<i; // this prints 18446744071562067968
}
Run Code Online (Sandbox Code Playgroud)

120*_*arm 15

1是a signed int,在你的系统上是32位. 1 << 31导致溢出,并且是负数(0x80000000).当转换为64位时unsigned long long,这将被转换为ULL值,即转换为ULL值0xFFFFFFFF80000000,或者您看到的大十进制数.