2

私はビットシフトの恐ろしい世界にいます。次のコードがあります。

この番号をシフトしています: 140638023551944 >> 5.

http://www.binaryhexconverter.com/decimal-to-binary-converterによると、140638023551944 のバイナリ表現は次のとおりです。

1000011000011111011101000111

右シフト 5、私は期待: 0000010000110000111110111010

しかし、代わりに、11111111110100011010111011011110001011110 である 4394938235998 を取得します。

私には、その数は元の数とはほとんど関係がないように見えます。一方に存在するパターンが他方に存在することはありません。とても奇妙です。

コードは次の行に沿っています。

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 ! しかし、右シフトがそのように機能するはずがないことは確かです!

4

1 に答える 1

0
// 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 );
    }
}
于 2015-01-03T18:44:35.427 に答える