如何用C语言中的union检测CPU的端模式
2012-02-26 10:55
344 查看
在看C++的时候,看到了union(共用体),同时想起在面试的时候,也经常被问到计算机大小端的测试方法,由此便写下这篇博文。
计算机的大小端问题由来已久,具体的历史大家可以看看维基百科里边是怎么简述的,还是挺不错的哦!~~
这里讲讲计算机里的大小端模式:
端模式 | 首字节 | 中间字节 | 尾字节 |
大端 | 最高有效位 | … | 最低有效位 |
小端 | 最低有效位 | … | 最高有效位 |
地址偏移 | 大端模式 | 小端模式 |
0x00 | 12 | 34 |
0x01 | 34 | 12 |
而在C语言中union是一个很特别的结构,它是把几种不同类型的变量存放到同一段内存中。而对union型成员的存取都是相对于该联合体基地址的偏移量为0处开始,也就是联合体的访问不论对哪个变量的存取都是从union的首地址位置开始的。利用这个特性,我们可以判断当前系统是大端还是小端。
下表可以很清晰的看出union在不同端模式下的存储方式:
大端模式 | | 小端模式 | |||
地址偏移量 | 类型 | 地址偏移量 | 类型 | ||
short | char | short | char | ||
0x000000 | 12 | 12 | 0x000000 | 34 | 34 |
0x000001 | 34 | 系统数据 | 0x000001 | 12 | 系统数据 |
若以上述16位的整数0x1234为例 |
/* Test environment: Dev-C++ 5.1.0.0 Test result: The compute is little-endian. */ #include <stdio.h> #include <stdlib.h> union data { short inter; char ch; }; int main(void) { union data c; c.inter = 0x1122; if(c.ch == 0x22) printf("The compute is little-endian.\n"); else printf("The compute is big-endian,\n"); getchar(); return 0; }
相关文章推荐
- 如何检测cpu的字节顺序是小端模式还是大端模式
- 如何在Windows下用cpu模式跑通py-faster-rcnn 的demo.py
- 如何检测CPU是大端还是小端
- 如何检测C语言中的内存漏洞(leak)?
- 如何判断CPU是大端还是小端模式
- 利用union判断CPU是大端模式还是小端模式
- 如何判断CPU是大端还是小端模式
- CPU 是如何检测溢出的
- Jquery如何序列化form表单数据为JSON对象 C# ADO.NET中设置Like模糊查询的参数 从客户端出现小于等于公式符号引发检测到有潜在危险的Request.Form 值 jquery调用iframe里面的方法 Js根据Ip地址自动判断是哪个城市 【我们一起写框架】MVVM的WPF框架(三)—数据控件 设计模式之简单工厂模式(C#语言描述)
- 更好的办法:用union判断系统中的CPU 是Little endian 还是Big endian 模式
- 如何判断CPU是大端还是小端模式
- CPU的大端模式(big endian)和小端(little endian)模式——Union的妙用
- caffe在windows下如何在vs2013新建工程开发自己的应用cpu模式
- 如何判断机器CPU是大端模式还是小端模式
- 如何判断CPU是大端还是小端模式
- C语言中如何不用STRLEN检测数组长度
- C语言中的内存泄露,如何避免,如何检测
- 如何判断CPU是大端模式还是小端模式
- C语言中的内存泄露,如何避免,如何检测
- 【转】如何判断CPU是大端还是小端模式