You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用memcpy复制字节数组到uint32_t时输出反转的原因探究

为什么uint32_t变量打印出44332211?

核心原因是你的系统采用了小端字节序(Little Endian),这是x86/x86_64架构处理器的默认字节序规则。

什么是小端字节序?

在小端字节序的系统中,多字节数据的最低有效字节(LSB)会被存储在内存的低地址位置,而最高有效字节(MSB)则存储在内存的高地址位置。

结合你的代码和输出分析

  1. 原数组arr的内存布局是:
    • 低地址:0x11 → 次低地址:0x22 → 次高地址:0x33 → 高地址:0x44
  2. memcpy(&cpy, arr, 4)会严格按照内存地址顺序复制字节,所以cpy的内存布局和arr完全一致:
    • 低地址0x7ffdc763c020:0x11(LSB)
    • 地址0x7ffdc763c021:0x22
    • 地址0x7ffdc763c022:0x33
    • 高地址0x7ffdc763c023:0x44(MSB)
  3. 当用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:45:37