1

Я искал, как это сделать, но я не нашел способ сделать это. Есть другой способ вычислить эту разницу вместо того, чтобы считать один за другим?

Например:

0x7fffffffe070 - 0x7fffffffe066 = 0x04
0x7fffffffe066 - 0x7fffffffe070  = -0x04

0x7fffffffdbe0 - 0x7fffffffda98 = ????

Чтобы понять эти результаты, давайте предположим, что мы открываем файл с помощью шестнадцатеричного редактора и имеем следующие шестнадцатеричные числа: 8A B7 00 00 FF с соответствующими им шестнадцатеричными смещениями: 0x7fffffffe066 0x7fffffffe067 0x7fffffffe068 0x7fffffffe069 0x7fffffffe070. Разница шестнадцатеричных смещений чисел 8A и FF составляет 0x04, потому что они различаются в 4 позициях.

2 ответа2

4

скриншот комментария

"Шестнадцатеричные смещения" являются просто обычными числами и не имеют специальных правил для вычитания. Вы получаете только другие результаты, потому что ваш ввод неверен:

у нас есть следующие шестнадцатеричные числа: 8A B7 00 00 FF с соответствующими им шестнадцатеричными смещениями: 0x7fffffffe066 0x7fffffffe067 0x7fffffffe068 0x7fffffffe069 0x7fffffffe070. Разница шестнадцатеричных смещений чисел 8A и FF составляет 0x04, потому что они различаются в 4 позициях.

В шестнадцатеричном формате сначала следует 0x9, затем 0xA, 0xB, 0xC, 0xD, 0xE, 0xF и только затем 0x10. Таким образом, если у вас есть 5 смежных байтов, а четвертый находится в 0x7FFF'FFFF'E069, следующий будет в 0x7FFF'FFFF ' E06A, а не 0x7FFF'FFFF'E070.

Другими словами, 0x…E070 - 0x…E066 = 0xA на самом деле правильный результат.

1

Я не уверен, но, возможно, вопрос в том, как рассчитать разницу вручную?

Вы можете рассчитать разницу AB, переписав ее в дополнениях. Вы бы сделали это, сначала перевернув / инвертировав все биты из B, а затем добавив это значение к A. Затем вы увеличиваете результат на 1 и обрезаете (сужаете) результат до такого же количества цифр (или битов), что и у исходных операндов. мы.

Демо с шестнадцатеричными значениями из его вопроса:

давайте вычислим 0x7fffffffe070 - 0x7fffffffe066:

 7fffffffe070  
 800000001f99 +  (this is 0x7fffffffe066 with all bits inverted)
===============
1000000000009
            1 +
===============
            A (or 10 decimal, or +0xa if you will)

А теперь давайте посчитаем 0x7fffffffe066 - 0x7fffffffe070:

7fffffffe066
800000001f8f +   (this is 0x7fffffffe070 with all bits inverted)
==============
fffffffffff5
           1 +
==============
fffffffffff6  (or -10 decimal / -0xa)

Легко перевернуть все биты шестнадцатеричной цифры, если вы знаете, что:

0 = F  (or 0000 ==> 1111)
1 = E  (or 0001 ==> 1110)
2 = D 
...
F = 0  (or 1111 ==> 0000)

И так далее...

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .