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 可见,大端模式和字符串的存储模式类似。