我身处可怕的位移世界。我有以下代码:
我要转移此号码: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!但是我很确定右移不应以这种方式起作用!
最佳答案
// EVERYTHING WORKS CORRECTLY!
#include <cassert> // assert()
#include <iostream> // cout
#include <cstdint> // UINT64_MAX
using namespace std;
int main() {
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";
{ // Everything works correctly!
assert( 140638023551944>>5 == 140638023551944/32 );
assert( 140638023551944>>5 == 4394938235998 );
assert( 140638023551944/32 == 4394938235998 );
assert( 140638023551944 < UINT64_MAX );
}
}