c语言union内存大小,C语言中联合(union)的内存分配

对于一个简单点的联合Union

union unn{

int i;

char a[3];

}

这样的联合占用四个字节没有任何问题。但是对于如下问题

unn untest;

untest.i=0x123456;

此时a[0],a[1],a[2]的值对于大端系统(高位低寸)存储内容应该是0x00,0x12,0x34,0x56此时将前三个字节转化到char即可输出结果

对于小端系统(高位高寸)存储内容应该是0x56,0x34,0x12,0x00取出前三个字节输出为char即可

二、什么是大端和小端

Big-Endian和Little-Endian的定义如下:

1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。

举一个例子,比如数字0x12 34 56 78在内存中的表示形式为:

1)大端模式:

低地址 -----------------> 高地址

0x12 | 0x34 | 0x56 | 0x78

2)小端模式:

低地址 ------------------> 高地址

0x78 | 0x56 | 0x34 | 0x12

可见,大端模式和字符串的存储模式类似。

对于一个简单点的联合Union union unn{ int i; char a[3]; } 这样的联合占用四个字节没有任何问题。但是对于如下问题 unn untest; untest.i=0x123456; 此时a[0],a[1],a[2]的值对于大端系统(高位低寸)存储内容应该是0x00,0x12,0x34,0x56此时将前三个字节转化到char即可输出结果 对于小端系统(高位高寸)存储内容应该是0x56,0x34,0x12,0x00取出前三个字节输出为char即可 二、什么是大端和小端 Big-Endian和Little-Endian的定义如下: 1) Little-Endian就是低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。 2) Big-Endian就是高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。 举一个例子,比如数字0x12 34 56 78在内存中的表示形式为: 1)大端模式: 低地址 -----------------> 高地址 0x12 | 0x34 | 0x56 | 0x78 2)小端模式: 低地址 ------------------> 高地址 0x78 | 0x56 | 0x34 | 0x12 可见,大端模式和字符串的存储模式类似。
经验分享 程序员 微信小程序 职场和发展