关于大端模式与小端模型的介绍,可以参看我之前写的一篇博客,这里不再赘述
https://blog.csdn.net/weixin_42445727/article/details/90700309
那么如何判定一个机器是大端模式还是小端模式呢?这里给出两种方法
方法一:利用数据转换的截断特性
1. void Judge_endian() 2. { 3. int a = 12345678; //这里随便定义一个数字 4. /****************************************************/ 5. 地址 大端模式 小端模式 6. 0x8000 12 78 7. 0x8001 34 56 8. 0x8002 56 34 9. 0x8003 78 12 10. /****************************************************/ 11. 12. char *p = (char *)&a;//在这里将整形a的地址转化为char*; 13. //方便后面取一个字节内容 14. 15. if(*p == 78)//在这里解引用了p的一个字节的内容与78进行比较; 16. printf("little-endian\n"); 17. else 18. printf("big-endian\n"); 19. }
方法二:利用union成员共用内存的方法
1. #include <stdio.h> 2. 3. typedef union NODE 4. { 5. int i; 6. char c; 7. }Node; 8. 9. int main(int argc, char *argv[]) 10. { 11. Node node; 12. 13. node.i = 0x12345678; 14. 15. if(node.c == 78) 16. printf("little-endian.\n"); 17. else 18. printf("big endian\n"); 19. 20. return 0; 21. }
这种方式运用到了union(共用体),所谓的共用体,就是共同使用一块内存,共用体的大小是共用体中的所有类型最大的哪一个。例如上面的共用体中int是四个字节,char为一个字节,那么这个共用体的大小就是四个字节。当然这个要看你的系统是多少位的(在这里我说的是32位系统,64位系统int是8个字节),先对共用体中的int型数据i赋初值,然后在用char去访问一个字节的数据,如果打印出结果为78(小端模式),反之为大端模式。