解析大小端及其判断
来源:互联网 发布:端口测试失败 编辑:程序博客网 时间:2024/06/06 12:58
我们都知道在计算机内存中有大端和小端之分。。。
大端模式:
数据的高字节在低地址中,而数据的低字节在高地址中。
即:地址由小向大增加,而数据从高位往低位放。。。
小端模式:
数据的高字节在高地址中,低字节在低地址中。
为什么会有大小端模式之分呢?
下面用这张图回答!!!
那么,知道了大小端的原理,该如何判断一台机器是大端模式还是小端模式呢??
下面我介绍两种判断大小端的方法:
1.通过不同指针类型所指不同内存大小来判定
定义一个变量 int i = 0;
假设i在内存中这样存储:
将i的地址取出来并强制类型转换成(char*)型,这样p所能指向的对象即整型 i 的第一个字节,这样在对p进行解引用,根据*p的值判断大小端:
若 *p == 0; 说明 i 在内存中确实如上图存储,高位在低地址,地位在高地址,为大端模式。。。
若 *p == 1;则说明 i 在内存中是将低位存在低地址,高位存在高地址,为小端模式。。。
代码:
int check_sys(){int i = 1;char* p = (char*) & i; if (*p == 1){return 1; //小端}elsereturn 0; //大端}
2.利用联合体进行判断
联合体的特性:
- 联合体所有成员变量共享内存,相对于联合体首地址偏移量都为 0
- 同一时间只能存储1个被选择的变量,对其他成员变量赋值会覆盖原变量
思路:由于联合体的所有成员引用的都是内存中的相同地址,
举个例子:
声明一个联合体
union n { int a; char b; };
定义一个联合体 :union n s;
很明显,在32位平台下此结构体总大小为4个字节。
假设在 1 在内存中如下存储:低位存在高地址,高位存在低地址,我们给s这个联合体中a赋值1,即s.a = 1。即s.a 在内存中如下存储。。
并且由于联合体的覆盖特性,我们从此联合体中取s.b,由于s.b是一个字符型,在取时只能取一个字节;
联合体union的存放顺序是所有成员都从低地址开始存放;必然也是从低地址开始读取:
因此:
若 s.b = 0;即说明高位存在低地址,上面假设正确,为大端模式。。
若 s.b = 1;编译器将低位存放在了低地址,说明上面假设不成立为小端模式。。
测试代码:
typedef union n{int a;char b;}n;int main(){ n s;s.a = 1; if (s.b == 1)printf("Little\n"); //小端elseprintf("Big\n"); //大端system("pause");return 0;}
<注:以上数据存储为32位计算机。。。>
2 0
- 解析大小端及其判断
- 大小端模式及其判断
- 大小端模式介绍及其判断
- 【Endian】C语言的大小端及其简单的判断。
- 快速判断大小端
- 判断大小端
- 判断大小端
- 大小端模式判断
- 判断大小端
- 判断系统大小端
- 判断大小端
- 大小端的判断
- 判断大小端
- 判断系统大小端
- 大小端模式判断
- 大小端判断问题
- 判断大小端
- 快速判断大小端
- 面试
- 谈了这么久的Project Tango?我们终于把它讲清楚
- 机器学习之数据清理经验
- maven的介绍和安装
- Spark分析之Master、Worker以及Application三者之间如何建立连接
- 解析大小端及其判断
- TabLayout+viewPager
- 冒泡排序简单分析!!
- Docker踩坑
- Dubbo中编码和解码的解析
- Faster RCNN roi_pooling_layer.cpp roi_pooling_layer.cu
- 团体程序设计天梯赛-练习集 L2-002. 链表去重 解题报告
- 用div来布局,css来显示
- Spark分析之Dependency