一、问题
计算机都是以⼋位⼀个字节为存储单位的,所以⼀个 16 位的整型就存在两种可能的存储顺序:⼤端模式和⼩端模式。那么⼤⼩端模式对共⽤体类型中的数据存储又有什么影响呢?
二、解答
1.⼤⼩端模式概述
考虑⼀个 int 型整数 29,将此整数转换为⼗六进制数为 0x3239 ,其中 0x32 为⾼位, 0x39 为低位。那么这个⼗六进制数在内存中可能有两种存储⽅式:
(1)⼤端模式存储。
⾼位 0x32 存放在低地址 0x1000 中,低位 0x39 存放在⾼地址 0x1001中。结果如图所示。
(2)⼩端模式存储。
⾼位 0x32 存放在⾼地址: 0x1001 中,低位 0x39 存放在低地址 0x1000 中。结果如图所示。
⼤端模式 (Big_endian)的含义就是字数据的⾼字节存储在低地址中,⽽字数据的低字节则存放在⾼地址中。⼩端模式 (Littleendian) 的含义就是字数据的⾼字节存储在⾼地址中,⽽字数据的低字节则存放在低地址中。
2.举例说明⼤⼩端模式对共⽤体类型数据的影响
union 型数据所占的内存等于其最⼤的成员所占的内存,对 union 型的成员的存取都是相对于该联合体基地址的偏移量为 0 处开始,也就是联合体的访问⽆论对哪个变量的存取都是从 union 的⾸地址位置开始,因此⼤⼩端模式的存储将会直接影响 union 成员的值。
例如,在主函数中声明⼀个联合体类型 u ,定义⼀个 union u 类型的变量 t ,引⽤ t 中的整型变量 i ,为其赋值为 1 ,若引⽤字符输出,显示 1 说明此系统的存储⽅式是⼩端模式,输出 0 说明该系统的存储⽅式是⼤端模式。相应代码如下。
main()
{
union u
{
int i;
char ch;
} t;
t.i = 1;
printf("%d\n", t.ch);
}
程序运⾏结果如下所示。
1
三、总结
上述例⼦还可以验证当前系统的存储模式。由运⾏结果可以看出,当前系统的存储模式为⼩端模式,即⾼字节存放在⾼地址中,低字节存放在低地址中。