Хранение данных IEEE754 с малым и большим порядком байтов - PullRequest
0 голосов
/ 20 июня 2019

В настоящее время я изучаю некоторые информационные технологии и у меня, вероятно, довольно простой вопрос .. Я получил задачу вычислить десятичный вывод дампа памяти в 4 байта, сохраненного как little-endian (IEEE754). Мои книги объяснили, как обращаться с типом расчета, когда данные хранятся как:

|--------- Byte 1 --------|--------- Byte 2 -------------|--------- Byte 3 ------------|--------- Byte 4 ------|
|sign e7 e6 e5 e4 e3 e2 e1|e0 m22 m21 m20 m19 m18 m17 m16|m15 m14 m13 m12 m11 m10 m9 m8|m7 m6 m5 m4 m3 m2 m1 m0|

У меня нет никакого полезного описания little / big endian… Я потратил много времени и понял, что приведенная выше таблица должна храниться как big endian. В описании для младшего байта указано, что первый байт будет в позиции 4-го байта, второй в позиции 3, третий в позиции два и четвертый в первом адресе.

Example:
Big endian: AB CD EF 01
Little endian: 01 EF CD AB

Прав ли я с этим?

Теперь я немного запутался, потому что это должно означать, например, что бит для знака числа является первым из байта AB, не так ли? Может ли кто-нибудь подтвердить или объяснить, правильно ли «перенесена» следующая таблица в little-endian:

|--------- Byte 1 ------|--------- Byte 2 ------------|--------- Byte 3 -------------|--------- Byte 4 --------|
|m7 m6 m5 m4 m3 m2 m1 m0|m15 m14 m13 m12 m11 m10 m9 m8|e0 m22 m21 m20 m19 m18 m17 m16|sign e7 e6 e5 e4 e3 e2 e1|

Большое спасибо !!!

1 Ответ

1 голос
/ 21 июня 2019

Ваша интерпретация совершенно верна.Это можно легко проверить с помощью простой программы.

#include <stdio.h>
#include <string.h>

int main() {

  float f=-123456.75f;
  int i;
  unsigned char c[4];

  memcpy(c,&f,4);
  memcpy(&i,&f,4);
  printf("decimal representation of f: %f\n",f);
  printf("hex representation of f: %a\n",f);
  printf("hex value of integer with the same bytes as f:  %x\n",i);
  printf("sucessive bytes in f (0:3): %.2x %.2x %.2x %.2x\n",c[0],c[1],c[2],c[3]);
  /* gives
decimal representation of f: -123456.750000
hex representation of f: -0x1.e240cp+16
hex value of integer with the same bytes as f:  c7f12060
sucessive bytes in f (0:3): 60 20 f1 c7
  */
}

Теперь я немного запутался, потому что это должно означать, что, например, бит для знака числа является первым из АББайт, не так ли?

Нет причин для путаницы.В памяти знаковый бит действительно будет MSB четвертого байта представления с плавающей запятой в архитектуре с прямым порядком байтов.
Но порядковый номер означает только то, как байты хранятся в памяти.Безотносительно к порядку байтов, после загрузки в регистр и манипулирования программой, поведение будет идентичным.
Мы привыкли писать слева направо и начинать числа с самой старшей цифры.Но другие схемы представления вполне допустимы при условии сохранения математических свойств.
Если это может помочь вам, запишите байты с наименьшим значащим битом слева (но справа и слева не имеют значения на компьютере).

|--------- Byte 1 ------|--------- Byte 2 ------------|--------- Byte 3 -------------|--------- Byte 4 --------|
|m0 m1 m2 m3 m4 m5 m6 m7|m8 m0 m10 m11 m12 m13 m14 m15|m16 m17 m18 m19 m20 m21 m22 e0|e1 e2 e3 e4 e5 e6 e7 sign|
...