为什么移位运算符似乎循环64位整数?

Loh*_*eek -2 c++ bit-manipulation bit-shift

我正在尝试使用C++中的位数组数据结构.这是一种简单的好奇心,但我该如何解释:

uint64_t a = 1;
uint64_t b = a << 1;

cout << (a == (a << 64)) << endl; // get 1
cout << (a == (b << 63)) << endl; // get 0
Run Code Online (Sandbox Code Playgroud)

看起来像<< x是循环的时候x >= 64,但是填充用零填充x < 64.我错了吗 ?

如果没有,解释是什么?我认为64位整数不是自然周期性的.

YSC*_*YSC 5

根据[ expr.shift ]:

如果右操作数为负数,或者大于或等于提升左操作数的位长度,则行为未定义.

因此,这是未定义的行为:

uint64_t a = 1;
a << 64;
Run Code Online (Sandbox Code Playgroud)