c++ 当移位超过30位时,uint64_t上的左移操作产生上述错误[重复]

xjreopfe  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(319)
    • 此问题在此处已有答案**:

Why does long long n = 200020002000*2000; overflow?(6个答案)
5天前关闭。
当我在uint64_t变量中使用左移时,如mask = 1 << 31或以上,所有位左移1;
我正在使用:
Ubuntu 22.04;
gnu ++23;
带有c_cpp扩展名的vscode;

int main(int argc, char const *argv[])
{

    uint64_t mask1{1};
    uint64_t mask2{1};

    mask1 = 1 << 30; // OK 1000000000000000000000000000000
    mask2 = 1 << 31; // ERROR 1111111111111111111111111111111110000000000000000000000000000000
    // Expecting 10000000000000000000000000000000

    return 0;
}
mrwjdhj3

mrwjdhj31#

在此行中:

mask2 = 1 << 31;

首先计算右侧的表达式,然后将其赋值给mask2
由于1int文字,因此表达式的计算结果为32位int
按以下方式更改它,以实现您想要的:

mask2 = static_cast<uint64_t>(1) << 31;

它将1视为无符号64位值执行移位。
具有类似结果的另一个选项是:

mask2 = 1ULL << 31;

相关问题