- #include <stdio.h>
- static union{
- char c[4];
- unsigned long mylong;
- }endian_test={{'l','?','?','b'}};
- #define ENDIANNESS ((char)endian_test.mylong)
- int main(int argc,char* argv[])
- {
- if(ENDIANNESS=='l')
- printf("qiang,CPU type is little-endian! \r\n");
- if(ENDIANNESS=='b')
- printf("qiang,CPU type is big-endian! \r\n");
- return 0;
- }
联合体采用的内存共享存储,联合体的两个成员大小一样,都占用四个字节,所以联合体占用四个字节。假如联合体的起始地址为0x0000,则大端和小端两个CPU的数据存储方式如下:
| 地址 | 大端 | 小端 |
| 0x0003 | 1 | b |
| 0x0002 | ? | ? |
| 0x0001 | ? | ? |
| 0x0000 | b | 1 |
(char)endian_test.mylong进行强制类型转换,取得的是起始地址的数据。如果CPU为小端,则“ENDIANNESS”为1;如果CPU为大端,则“ENDIANNESS”为b
本文深入探讨了小端和大端字节存储方式的区别,并通过一个简单的C程序展示了如何通过编译时变量判断当前CPU是小端还是大端。通过这个例子,读者可以更好地理解计算机内部数据的存储逻辑。
579

被折叠的 条评论
为什么被折叠?



