我正处于可怕的位移世界中。我有以下代码:
我正在转移这个号码:140638023551944 >> 5。
根据http://www.binaryhexconverter.com/decimal-to-binary-converter的 140638023551944 的二进制表示是
1000011000011111011101000111
右移 5,我预计:0000010000110000111110111010
但相反,我得到 4394938235998,即 111111111101000110101110110111110001011110。
在我看来,这个数字与原来的数字几乎没有任何关系。我看不到另一个存在的模式。这很奇怪。
代码大致如下:
uint64_t n, index, tag;
uint64_t one = 1;
uint64_t address = 140638023551944;
/*left shift to get index into the last index.length() number of slots*/
cout << "original address is " << address << " " << "\n";
n = (address >> 5);
cout << "after right shifting away offset bits " << n << "\n";
“地址”填充了正确的整数 140638023551944。我已经验证过了。
这是什么奇怪的行为?它与这个模拟器一致: http: //www.miniwebtool.com/bitwise-calculator/bit-shift/ ?data_type=10&number=140638023551944&place=5&operator=Shift+Right !但我很确定右移不应该那样工作!