захват старших 4 байтов 8-байтового слова - PullRequest
3 голосов
/ 08 мая 2011

Я умножаю 0x1d400 * 0xE070381D.

Когда я делаю это на своем калькуляторе, результат равен 0x00019A4D26950400

Когда я попытался реализовать это в cpp, вот что у меня есть.

long long d;

d = 3765450781 * 1d400;

Результат, который дает этот код: d = 0x26950400. Это только 4 нижних байта, что случилось со всем остальным?

Я пытаюсь выделить старшие 4 байта 0x00019A4D и сохранить их в другую переменную. Как это можно сделать?

Если бы я мог заставить умножение отображать все 8 байтов, то, что я думал сделать, чтобы изолировать старшие 4 байта, было бы:

d = d & 0xFF00; //0xFF00 == (binary) 1111111100000000

d = d>>8;

Будет ли это работать?

Ответы [ 3 ]

6 голосов
/ 08 мая 2011

Добавьте LL после чисел (например, 3765450781LL), в противном случае они рассчитываются как int с, а остальное обрезается перед присвоением d.

5 голосов
/ 08 мая 2011

Вам необходимо использовать LL после вашей константы для long long, как указано в другом ответе MByD.

Кроме того, ваш тип данных должен быть unsigned long long. В противном случае, когда вы сдвигаетесь вправо, вы можете получить повторение самого левого бита из-за расширения знака. (Это зависит от машины, но большинство машин подписывают отрицательные числа при смещении вправо.)

Вам не нужно маскировать верхние 4 байта перед сдвигом вправо, потому что вы собираетесь отбросить нижние 4 байта в любом случае, когда делаете сдвиг вправо.

Наконец, обратите внимание, что аргументом >> является число битов для смещения, а не байтов. Следовательно, вы хотите

d = d >> 32;

Который также можно записать как

d >>= 32;
1 голос
/ 08 мая 2011

Как отмечали другие, вы должны суффиксить свои 64-битные числовые литералы с LL.

Чтобы напечатать переменную long long в шестнадцатеричном формате, используйте спецификатор формата "%016llX":

long long d;
d = 3765450781LL * 0x1d400LL;
printf("%016llX\n", d);

выходы 00019A4D26950400.

Чтобы получить верхний и нижний 32 бита (4 байта) переменной d, вы можете сделать:

unsigned int upper;
unsigned int lower;

upper = d >> 32;
lower = d & 0x00000000FFFFFFFF;

printf("upper: %08X lower: %08X\n", upper, lower);
...