C++中的右移产生异常结果(无符号64位)

Right Shift in C++ giving unusual results (unsigned 64-bit)

本文关键字:结果 无符号 64位 异常 右移 C++      更新时间:2023-10-16

我身处比特移位的可怕世界。我有以下代码:

我正在拨这个号码:140638023551944>>5。

140638023551944的二进制表示根据http://www.binaryhexconverter.com/decimal-to-binary-converter是

100001100011111011101000111

右移5,我预计:000001000011000111110111010

但是,我得到了4394938235998,即1111111111 01000110101110110111110001011110。

在我看来,这个数字与原来的数字几乎没有任何关系。我看不出一种模式存在于另一种模式中。这很奇怪。

代码大致如下:

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&号码=140638023551944&位置=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 );
    }
}