使用memcpy复制字节数组到uint32_t时输出反转的原因探究
为什么uint32_t变量打印出44332211?
核心原因是你的系统采用了小端字节序(Little Endian),这是x86/x86_64架构处理器的默认字节序规则。
什么是小端字节序?
在小端字节序的系统中,多字节数据的最低有效字节(LSB)会被存储在内存的低地址位置,而最高有效字节(MSB)则存储在内存的高地址位置。
结合你的代码和输出分析
- 原数组
arr的内存布局是:- 低地址:
0x11→ 次低地址:0x22→ 次高地址:0x33→ 高地址:0x44
- 低地址:
memcpy(&cpy, arr, 4)会严格按照内存地址顺序复制字节,所以cpy的内存布局和arr完全一致:- 低地址
0x7ffdc763c020:0x11(LSB) - 地址
0x7ffdc763c021:0x22 - 地址
0x7ffdc763c022:0x33 - 高地址
0x7ffdc763c023:0x44(MSB)
- 低地址
- 当用
printf("%x\n", cpy)打印uint32_t类型时,程序会把cpy解析成一个完整的32位无符号整数:- 小端字节序下,内存高地址的
0x44是这个整数的最高位字节,依次往下是0x33、0x22,最低位字节是内存低地址的0x11 - 组合起来就是
0x44332211,对应输出的44332211
- 小端字节序下,内存高地址的
关于数组cpy2的输出
cpy2是uint8_t类型的数组,每个元素都是单字节数据,不存在多字节解析的问题。memcpy复制后,数组元素的内存顺序和原数组完全一致,所以按索引顺序打印时,自然输出11 22 33 44。
内容的提问来源于stack exchange,提问作者Kaustubh Shankar
相关产品推荐
相关产品推荐

