c语言-union联合体
linux中联合体union实现判断Little endian 和 Big endian(大端和小端)
1、联合体的数据成员从低字节开始对齐
2、 Little endian 和 Big endian。
Little endian 和 Big endian 是 CPU 存放数据的两种不同顺序。对于整型、长整型等数据类型, Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而 Little endian 则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。
假设一个数据为0x1234abcd,其地址为 0x0000 的四个字节变量,若字节序为 big-endian,则读的第一个字节0x00存放的数据为12;
若字节序位 little-endian,则读出结果为 cd。
一般来说, x86 系列 CPU 都是 little-endian 的字节序, PowerPC 通常是 Big endian,还有的 CPU 能通过跳线来设置 CPU 工作于 Little endian 还是 Big endian 模式.
linux中的实现源代码
static union { char c[4]; unsigned long l; } endian_test = { { 'l', '?', '?', 'b' } };
#define ENDIANNESS ((char)endian_test.l)
如果 ENDIANNESS=’l’表示系统为 little endian,为’b’表示 little endian
在宏定义中取得是endian_test.l中的最低位,通过强制转换来实现,将其转换成char类型的数据,取得其四字节中的最低字节。
因为联合体的数据成员从低字节开始对齐,在输入联合体中的数据时从最低字节开始输入,即’I’在最低字节,'b’在最高字节,共四个字节,当读取endian_test.l时,其占用四个字节,强制转换读取endian_test.l的最低位数据,为I时表明它的最低位在最低字节,为d时表明它的最低位在最高字节,从而判断出CPU是little endian还是little endian
上一篇: C语言学习篇(编程总结)
下一篇: PTA5-6 水仙花数 (C语言)