Как процессор с прямым порядком байтов сохраняет число в своей памяти в C? - PullRequest
1 голос
/ 13 января 2020
short a = 0x1234;
char *p = &a;
printf("%x%x", *p, *(p+1));

output
3412

Мне интересно, как память хранит значение 0x1234. Сначала я думал, что 0x1234 сохраняется в памяти как 0x3412 (обратный на байт), но в соответствии с нумерацией lsb 0 кажется правильным, что память сохраняет 0x1234 как 0x2c48 (обратный на бит). Я думаю, что значение 0x1234 сохраняется в памяти как 0x2c48 и Процессор с прямым порядком байтов рассматривает 0x2c48 как 0x1234. Это правильно?

Ответы [ 3 ]

7 голосов
/ 13 января 2020

В системе с прямым порядком байтов многобайтовое слово сохраняется в обратном порядке byte .

Так, например, 16-битное слово 0x1234 будет сохранено с 0x34 в младшем адресе и 0x12 в старшем адресе.

В качестве байтового массива это будет

uint8_t word[2] = { 0x34, 0x12 };

Биты байта никогда не меняются местами.


32-разрядное (четырехбайтовое) слово типа 0x12345678 будет храниться в следующем порядке: 0x78, 0x56, 0x34 и 0x12 (от низкого до высокого адреса).

2 голосов
/ 13 января 2020

Процессоры Little Endian сначала сохраняют младший байт, а затем более старшие байты.

Например, short int a = 0x1234 будет храниться как

|------|------|
| 0x34 | 0x12 |
|------|------|

Сохраняется 32-битное целое число unsigned int b = 0x12345678 как

|------|------|------|------|
| 0x78 | 0x56 | 0x34 | 0x12 |
|------|------|------|------|
1 голос
/ 13 января 2020

Невозможно определить , в каком «порядке» ваш ЦП хранит биты, потому что вы не можете адресовать отдельные биты.

Младший порядок означает, что ЦП сначала сохраняет младший байт. Но что означает first ? Это значит с самым низким адресом. У битов нет адресов, поэтому невозможно определить, кто из них первый. Конец истории.

Вот как мы говорим, является ли CPU байтовым порядком байтов:

         LITTLE ENDIAN                 BIG ENDIAN

words:      0x1234           words:      0x1234       
        /---------------\            /---------------\

bytes:    0x34     0x12      bytes:    0x34     0x12  
        /------\ /------\            /------\ /------\

        +------+ +------+            +------+ +------+
        | 0x34 | | 0x12 |            | 0x34 | | 0x12 |
        +------+ +------+            +------+ +------+

Address:  5000     5001      Address:  5001     5000  

Я записал байты в одинаковом порядке с обеих сторон, но адрес разные.

Вот как вы различаете разницу между порядком байтов и порядком байтов. Вы пишете слово для адреса 5000, затем проверяете, содержит ли байт с адресом 5000 0x34 или 0x12.

Теперь с битами у вас возникает такая ситуация:

        LITTLE BIT-ENDIAN             BIG BIT-ENDIAN

bytes:        0x34           words:        0x34       
        /---------------\            /---------------\

        +-+-+-+-+-+-+-+-+            +-+-+-+-+-+-+-+-+                                                          
bits:   |0|0|1|0|1|1|0|0|    bits:   |0|0|1|0|1|1|0|0|
        +-+-+-+-+-+-+-+-+            +-+-+-+-+-+-+-+-+

address:      5000                          5000

Я написал биты в одинаковом порядке с обеих сторон, но адрес один и тот же. Только байт имеет адрес. Отдельные биты не имеют адресов. Если бы у них были адреса, вы могли бы попросить, скажем, бит 5000.4 и посмотреть, является ли это 1 или 0, чтобы выяснить, являются ли биты младшими или старшими, но их нет, поэтому вы не можете.

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

...