вопрос из careercup о порядке байтов - PullRequest
2 голосов
/ 10 февраля 2011

программа предназначена для определения порядкового или малого порядкового номера.

Это ответ, приведенный в книге:

int Test(){
    short int word = 0x0001;
    char *byte = (char *) &word;
    return (byte[0] ? BIG:LITTLE);
}

Я не понимаю этой строки:это значит "передать адрес слова в байт"?Итак, теперь байт указывает на оригинальный адрес слова?Как я знаю, короткий int составляет 2 байта.Итак, указывает ли «байт» на более высокий или более низкий адрес?Почему?

Как это работает?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2011

Если мы предположим, что значение short равно 2 байтам, то структура памяти выглядит так на большой машине с прямым порядком байтов:

MSB        LSB
-------------------
|  0x0   |   0x1  |
-------------------

И так на маленькой машине с прямым порядком байтов

MSB        LSB
-------------------
|  0x1   |   0x0  |
-------------------

Таким образом, короткий 0x0001 состоит из 2 байтов, один со значением 0, другой со значением 1. На старшем байтовом компьютере наименее значимый байт (здесь 0x1) хранится в младшем адресе памяти этого короткогостарший байт хранится в старшем адресе.На машине с прямым порядком байтов все наоборот.

Итак, char *byte = (char *) &word; получает адрес word и интерпретирует его как символ *.Предполагая, что символ равен 8 битам, теперь у нас есть указатель на наименее значимый байт нашего короткого замыкания.Если это 0x1, машина с прямым порядком байтов, как показано на диаграмме выше.Если он равен 0, то это немного порядковый номер машины.

(обратите внимание, что этот способ проверки на порядковый номер не может быть переносимым - например, есть машины, где символ имеет такой же размер, как и short, и многие другие более или менее).эзотерические ошибки с таким подходом)

3 голосов
/ 10 февраля 2011

Он просто берет адрес word, приводит его к указателю на символ и помещает его в byte.

В этот момент byte будет указывать на первый байт 2-байтового word, а значение этого байта (1 или 0) сообщит вам, есть ли у вас машина с прямым или прямым порядком байтов.

0 голосов
/ 10 февраля 2011

Вы хотите прочитать слово по шагам одного байта. Таким образом, вы берете указатель на слово, которое будет смотреть на байт за раз. Это символ *, поскольку по стандартному определению символ равен 1 байту. Затем вы указываете свой символ * на место памяти, в котором было выделено слово, и читаете первое значение (байт [0], вы могли бы также использовать * байт для разыменования его). Если это 1, это машина с прямым порядком байтов:

01 00

Если это ноль, то это немного порядковый номер машины

00 01
...