c++ 为什么运行时和编译时的无符号左移位溢出不同?[duplicate]

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

Why doesn't left bit-shift, "<<", for 32-bit integers work as expected when used more than 32 times?(10个答案)
Unexpected C/C++ bitwise shift operators outcome(6个答案)
Why the output of printf("%llu\n", 1ull << n); and printf("%llu\n", 1ull << 64); is different in C++? (n=64) [duplicate](3个答案)
Is right-shifting an unsigned integer by its total number of bits UB ? [duplicate](1个答案)
3天前关闭。
我有下面的C++代码

#include <iostream>
using namespace std;
int main(){
    unsigned long long a;
    cin>>a;
    cout<< (1ull<<64ull) << ' ' << (1ull<<a) << endl;
}

现在输入64,输出为

0 1

简而言之,编译器似乎在运行时使用了循环移位。但是从我对the relevant cppreference page的阅读来看,我认为它应该是标准的模运算,所以这个位应该像编译时版本一样消失。我在GCC 11、GCC 12和clang 14上测试了这个,所以它不太可能是一个编译器bug。那么我错过了什么呢?

xghobddn

xghobddn1#

从引用的cppreference页面
在任何情况下,如果右操作数的值为负,或者大于或等于提升的左操作数中的位数,则行为未定义。
由于64是我的机器上unsigned long long中的位数,因此这是未定义的行为

相关问题