C int 内存存储。最低有效位与最高有效位?
C int memory storage. Least signinficant vs most significant bits?
当我在内存中连续组合它们时,我希望以下两个 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 内存的理解遗漏了什么?
谢谢! :-)
叫做endianess
。
现在大多数系统都使用小端。在这个系统中,首先存储的是最低有效字节。因此 0x0100 存储(假设 2 字节表示)为 {0x00, 0x01}
与您的情况完全相同
ut[0] 插入到 mem16 的 LSB 上,ut[1] 插入到 MSB 上。
当我在内存中连续组合它们时,我希望以下两个 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 内存的理解遗漏了什么? 谢谢! :-)
叫做endianess
。
现在大多数系统都使用小端。在这个系统中,首先存储的是最低有效字节。因此 0x0100 存储(假设 2 字节表示)为 {0x00, 0x01}
与您的情况完全相同
ut[0] 插入到 mem16 的 LSB 上,ut[1] 插入到 MSB 上。