- 此问题在此处已有答案**:
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。那么我错过了什么呢?
1条答案
按热度按时间xghobddn1#
从引用的cppreference页面
在任何情况下,如果右操作数的值为负,或者大于或等于提升的左操作数中的位数,则行为未定义。
由于64是我的机器上
unsigned long long
中的位数,因此这是未定义的行为