Я ожидаю, что следующая комбинация из двух 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? Спасибо! :-)

1
L. Arnaud 21 Апр 2020 в 13:17

2 ответа

Лучший ответ

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

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

2
P__J__ 21 Апр 2020 в 10:40

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

-2
omid.azmoon 21 Апр 2020 в 10:42