бинарные операторы — правый сдвиг в C ++, выдающий необычные результаты (64-разрядные без знака)

Я в ужасном мире сдвига. У меня есть следующий код:

Я смещаю этот номер: 140638023551944 >> 5.

Двоичное представление для 140638023551944 согласно http://www.binaryhexconverter.com/decimal-to-binary-converter является

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&число = 140638023551944&место = 5&Оператор = Shift + Right! Но я уверен, что смещение вправо не должно работать таким образом!

2

Решение

// 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 );
}
}
0

Другие решения