Что означают эти шестнадцатеричные значения? - PullRequest
0 голосов
/ 08 марта 2019

У меня есть таблица значений шестнадцатеричных значений (я думаю, что это шестнадцатеричные байты?), И я пытаюсь выяснить, что они значат в десятичном виде.

enter image description here

На сайте автор заявляет, что выделенные значения 43 7A 00 00 означают 250 в десятичном виде, но когда я вводю их в преобразователь из шестнадцатеричного в десятичное, я получаю 1132068864 .

За свою жизнь я не понимаю, что происходит. Я знаю, что названия выше выделенных значений 1 2 3 4 5 6 7 8 9 A B C D E F - это шестнадцатеричная система, но я не понимаю, как вы читаете значения внутри таблицы.

Помощь будет оценена!

1 Ответ

1 голос
/ 09 марта 2019

Здесь происходит то, что байты 43 7A 00 00 не рассматриваются как целые числа. Они обрабатываются как 32-разрядное число с плавающей запятой в формате IEEE. Вот почему в столбце Type в окне Inspector на изображении указано Float. Когда эти байты интерпретируются таким образом, они действительно представляют значение 250.0.

Подробнее о формате можно прочитать на https://en.wikipedia.org/wiki/Single-precision_floating-point_format

В этом конкретном случае байты будут декодированы как:

  • «знаковый» бит 0, означающий, что значение является положительным числом
  • поле «экспонента», содержащее биты 1000 0110 (или шестнадцатеричное 86 , десятичное число 134), означающее, что показатель степени имеет значение 7 (рассчитывается путем вычитания 127 из необработанного значения поля, 134 )
  • поле значимого поля, содержащее биты 1111 1010 0000 0000 0000 0000 (или шестнадцатеричное значение FA0000 , десятичное число 16384000)

Значимые значения и показатель степени объединяются по формуле:

    value = ( significand * (2 ^ exponent) ) / (2 ^ 23)

, где a ^ b означает « a , возведенный в степень b ».

В этом случае это дает:

    value = ( 16384000 * 2^7 ) / 2^23
          = ( 16384000 * 128 ) / 8388608
          = 250.0
...