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

大端系统相同输入输出不同原因解析及统一输出值探寻

大端系统下Union类型赋值后的字节序差异问题

作为大端系统的新手,我在学习其基础特性时发现:当给union的不同数据类型赋值1后,读取u64类型的值时,大端系统的结果各不相同,而小端系统的结果始终一致。

定义的Union类型

union types {
        uint8_t  u8;
        uint16_t u16;
        uint32_t u32;
        uint64_t u64;
};

测试代码

union types a={0};

a.u8 = 1;
printf("A. u64 %016lx\n", a.u64);

a.u16 = 1;
printf("B. u64 %016lx\n", a.u64);

a.u32 = 1;
printf("C. u64 %016lx\n", a.u64);

a.u64 = 1;
printf("D. u64 %016lx\n", a.u64);

测试结果

  • 大端系统:
A. u64 0100000000000000
B. u64 0001000000000000
C. u64 0000000100000000
D. u64 0000000000000001
  • 小端系统:所有结果均为0000000000000001

差异原因

核心是**字节序(Endianness)**的存储规则不同:

  • 小端系统:数据的低字节存储在内存的低地址处。当给u8/u16/u32赋值1时,都是把值为1的字节放到union的起始内存地址(最低地址),而读取u64时,这个字节会被解析为数值的最低位,所以最终结果都是0x1。
  • 大端系统:数据的高字节存储在内存的低地址处。不同类型赋值1时,1所在的内存位置完全不同:
    • u8=1:1被存在union的第一个字节(对应u64的最高位字节),所以u64读取结果为0x0100000000000000
    • u16=1:1是u16的低字节,对应大端存储里的第二个字节,u64读取结果为0x0001000000000000
    • u32=1:1是u32的低字节,对应大端存储里的第四个字节,u64读取结果为0x0000000100000000
    • u64=1:1是u64的低字节,对应大端存储里的第八个字节,u64读取结果为0x0000000000000001

是否存在统一赋值后结果一致的值?

有,只要赋值的数值满足所有字节位完全相同,就能保证大端系统下读取u64的结果一致:

  • 全0值:给任意类型赋值0,u64读取结果都是0x0000000000000000
  • 全1值:比如u8=0xFF、u16=0xFFFF、u32=0xFFFFFFFF、u64=0xFFFFFFFFFFFFFFFF,此时union的所有内存字节都会被填充为0xFF,读取u64结果为0xFFFFFFFFFFFFFFFF
  • 任意字节重复值:比如0xAA,对应u8=0xAA、u16=0xAAAA、u32=0xAAAAAAAA、u64=0xAAAAAAAAAAAAAAAA,赋值后u64读取结果始终一致。

内容的提问来源于stack exchange,提问作者usav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:52:46