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,或您看到的大十进制数。