C/C++知识点:解析大小端及其判断
小标 2018-06-15 来源 : 阅读 829 评论 0

摘要:本文主要向大家介绍了C/C++知识点的解析大小端及其判断,通过具体的实例让大家了解,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了C/C++知识点的解析大小端及其判断,通过具体的实例让大家了解,希望对大家学习C/C++知识点有所帮助。

我们都知道在计算机内存中有大端和小端之分。。。

大端模式:

数据的高字节在低地址中,而数据的低字节在高地址中。

即:地址由小向大增加,而数据从高位往低位放。。。

小端模式:

数据的高字节在高地址中,低字节在低地址中。

为什么会有大小端模式之分呢?

下面用这张图回答!!!

 C/C++知识点:解析大小端及其判断

那么,知道了大小端的原理,该如何判断一台机器是大端模式还是小端模式呢??

下面我介绍两种判断大小端的方法:

1.通过不同指针类型所指不同内存大小来判定

定义一个变量 int i = 0;

假设i在内存中这样存储:

 C/C++知识点:解析大小端及其判断

将i的地址取出来并强制类型转换成(char*)型,这样p所能指向的对象即整型 i 的第一个字节,这样在对p进行解引用,根据*p的值判断大小端:

若 *p == 0; 说明 i 在内存中确实如上图存储,高位在低地址,地位在高地址,为大端模式。。。

若 *p == 1;则说明 i 在内存中是将低位存在低地址,高位存在高地址,为小端模式。。。

代码:

[cpp] view plain copy 
1. int check_sys()  
2. {  
3.     int  i = 1;  
4.     char* p = (char*) & i;   
5.     if (*p == 1)  
6.     {  
7.         return 1;     //小端  
8.     }  
9.     else  
10.         return 0;    //大端  
11. }

 

2.利用联合体进行判断

联合体的特性:

· 联合体所有成员变量共享内存,相对于联合体首地址偏移量都为 0

· 同一时间只能存储1个被选择的变量,对其他成员变量赋值会覆盖原变量

思路:由于联合体的所有成员引用的都是内存中的相同地址,

举个例子:

声明一个联合体

[cpp] view plain copy 
1.          union n  
2.           {  
3.        int a;  
4.    char b;  
5. };

定义一个联合体 :union n s;

很明显,在32位平台下此结构体总大小为4个字节。

假设在 1 在内存中如下存储:低位存在高地址,高位存在低地址,我们给s这个联合体中a赋值1,即s.a = 1。即s.a 在内存中如下存储。。

 C/C++知识点:解析大小端及其判断

并且由于联合体的覆盖特性,我们从此联合体中取s.b,由于s.b是一个字符型,在取时只能取一个字节;

联合体union的存放顺序是所有成员都从低地址开始存放;必然也是从低地址开始读取:

因此:

若 s.b = 0;即说明高位存在低地址,上面假设正确,为大端模式。。

若 s.b = 1;编译器将低位存放在了低地址,说明上面假设不成立为小端模式。。

测试代码:

[cpp] view plain copy 
1. typedef union n  
2. {  
3.     int a;  
4.     char b;  
5. }n;  
6. int main()  
7. {  
8.     n s;  
9.     s.a = 1;   
10.     if (s.b  == 1)  
11.         printf("Little\n"); //小端  
12.     else  
13.         printf("Big\n");   //大端  
14.     system("pause");  
15.     return 0;  
16. }


<注:以上数据存储为32位计算机。。。>

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 1 不喜欢 | 0
看完这篇文章有何感觉?已经有1人表态,100%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程