64位移位问题

Łuk*_*Lew 3 c++ 64-bit

为什么这段代码不写0作为最后一个元素但是18446744073709551615?(用g ++编译)

#include <iostream>

using namespace std;
int main(){
    unsigned long long x = (unsigned long long) (-1);
    for(int i=0; i <= 64; i++)
        cout << i << " " << (x >> i) << endl;
    cout << (x >> 64) << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Meh*_*ari 13

当您将值移位多于字大小时,它通常会被移位mod word-size.基本上,将其移位64意味着移位0位,这相当于根本没有移位.您不应该依赖于此,因为它不是由标准定义的,并且在不同的体系结构上可能有所不同.


Tyl*_*nry 7

将数字移动等于或大于其宽度的位数是未定义的行为.您只能安全地在0到63个位置之间移动64位整数.

  • @jn:英特尔手册为"x86程序集"定义它.它在C级未定义. (4认同)