Как рассчитать разницу между двумя шестнадцатеричными смещениями?

1205
user3358218

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

Например:

0x7fffffffe070 - 0x7fffffffe066 = 0x04 0x7fffffffe066 - 0x7fffffffe070 = -0x04  0x7fffffffdbe0 - 0x7fffffffda98 = ???? 

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

1

2 ответа на вопрос

4
grawity

screenshot of a comment

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

у нас есть следующие шестнадцатеричные числа: 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; Мне потребовалась минута, чтобы понять, о чем на самом деле спрашивают. Ramhound 7 лет назад 0
1
E. van Putten

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

Вы можете рассчитать разницу 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) 

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