Определение шестнадцатеричных значений адреса машины с прямым порядком байтов - PullRequest
2 голосов
/ 07 апреля 2019

Я немного запутался, как бы вы подошли к этой проблеме:

Рассмотрим десятичное число 1027. Это значение сохраняется как 16-битное число с двумя дополнительными числами в адресах 124 и 125 на машине с прямым порядком байтов, котораяимеет адресуемый размер ячейки один байт.Какие значения (в шестнадцатеричном формате) есть в каждом из этих адресов:

124:

125:

Я знаю, что машина с прямым порядком байтов упорядочивает адреса из наименее значимого байтадо самого значимого байта.Но, кроме того, я не уверен, как вы примените эту концепцию и как вы упорядочите байты в адресах.

Ответы [ 3 ]

0 голосов
/ 07 апреля 2019

Каждый целочисленный тип, который больше, чем char, учитывает концепцию младшего и старшего порядкового номера.

Когда вы пишете код на C, вам не нужно беспокоиться о младшем и старшем порядке. Например, если у вас есть int X=100, Y=200;, то X+Y будет постоянно возвращать 300, для каждой реализации C.

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

С другой стороны, в C целое число типа int хранится не в 16 битах, а как минимум в 16 битах.

Чтобы увидеть, является ли машина младшим или старшим порядковым номером, вы можете инициализировать значение X с 256 и извлечь первые 8 бит и посмотреть, равны ли они 0 или нет. *((unsigned char*)&X)&((1<<8)-1))!=0. В зависимости от результата этого выражения вы определяете макрос LITTLE_ENDIAN или BIG_ENDIAN

Чтобы прочитать каждый байт целого числа, вы можете определить структуру, подобную этой

typedef struct {
#if LITTLE_ENDIAN
unsigned char low;
unsigned char high;
#elif BIG_ENDIAN
unsigned char high;
unsigned char low;
#endif
} order_integer;

тогда вы можете заказать целое число, используя

x=400; 
order_integer *o=(order_integer*)&x; 
printf("%u %u\n", o->low, o->high);

Если вы хотите прочитать целое число из адресов 124 и 125 (предположим, что вы проверили и уверены, что sizeof int = 2), то вы можете сделать это:

order_integer *o = (order_integer*)124;
printf("%u %u\n", o->low, o->high);
0 голосов
/ 07 апреля 2019

«Little endian» и «big endian» относятся к тому, как машина мультиплексирует байты из памяти в регистры ЦП.

С каждым полученным байтом он увеличивает счетчик адресов, но размещает ихбайты слева направо или справа налево в регистр?

Таким образом, адрес, который загружается в машинный регистр (или целое число), может быть сохранен в памяти в обратном порядке.Даже с современными ЦП с широкими шинами данных концепция сохранялась, и в некоторых ЦП байты меняются внутри ЦП.

0 голосов
/ 07 апреля 2019

Вот простой код Python для преобразования этого целого числа в шестнадцатеричное представление с прямым порядком байтов:

# convert the integer (1027) to hex using 2 bytes and little-endian byteorder
(1027).to_bytes(length=2, byteorder='little').hex()

Это дает 0304.Итак, первый байт (03) находится в адресе 124, а второй (04) занимает следующий адрес - 125.

...