先看代码:
1 #include <stdlib.h> 2 #include <stdio.h> 3 /********************************************************************** 4 * 5 * 联合体的概念和特征 6 * 内存存储的大端模式(Big-endian)和小端模式(Little-endian) 7 * 判断当前系统的大端还是小端一例 8 * 9 **********************************************************************/ 10 11 int checkSystem(); 12 13 int main(int argc, char * argv[]) 14 { 15 16 int res = checkSystem(); 17 if(res) 18 { 19 printf("this is Little_endian\n"); 20 21 }else 22 { 23 printf("this is Big_endian\n"); 24 25 } 26 27 28 } 29 int 30 checkSystem() 31 { 32 union checkdata 33 { 34 int i; 35 char ch; 36 37 } check; //定义一个有两个数据项的联合体,特征就是任何一个元素均是从联合体的基地址开始存储或保存 38 check.i = 1; 39 return (check.ch == 1); 40 41 }
注:
1)联合体的概念和特征:union维护足够的空间来存放多个数据成员中的“一种”,而不为每一个数据成员都配置空间,在union中所有的成员共用同一个空间,同一时间只存储一个数据成员,最大的特征就是所有的数据成员具有相同的起始地址即联合体的基地址。
2)计算机中字节存储主要有两种:大端模式(Big_endian)和小端模式(Little_endian),从英文名字上可以明白,大端模式是从低地址开始,高位结束;小端模式是从高地址开始,低地址结束。
3)利用union中所有数据成员具有同样的起始地址的特点,通过一个int成员存储1,然后通过char成员来读取,即可巧妙地得出数据存放的方式,若通过char成员(即读取起始位置上的第一个字节)读取,若得出值为1,则说明是小端模式。
通过GCC编译运行,运行结果跟计算机有关,(有的计算机支持两种模式,可通过设置来切换),在我机器上运行结果是:this is Little_endian