C в памяти. Наименее значимые против наиболее значимых бит? - PullRequest
1 голос
/ 21 апреля 2020

Я ожидаю, что следующая комбинация из двух uint8_t (0x00 и 0x01) в один uint16_t даст мне значение 0x0001, когда я последовательно объединю их в памяти. Вместо этого я получаю 0x0100 = 256, что меня удивляет.

#include <stdio.h>
#include <stdint.h>

int main(void){

    uint8_t u1 = 0x00, u2 = 0x01;
    uint8_t ut[2] = {u1, u2};
    uint16_t *mem16 = (uint16_t*) ut;

    printf("mem16 = %d\n", *mem16);

    return 0;
}

Может ли кто-нибудь объяснить мне, что я упустил в моем нынешнем понимании C памяти? Спасибо! : -)

Ответы [ 2 ]

2 голосов
/ 21 апреля 2020

Это называется endianess.

Большинство систем в настоящее время используют порядок байтов. В этой системе сначала хранится младший значащий байт. Таким образом, 0x0100 сохраняется (при условии представления в 2 байта) как {0x00, 0x01} точно так же, как в вашем случае

0 голосов
/ 21 апреля 2020

ut [0] вставляется в LSB памяти mem16, а ut [1] в MSB.

...