判断机器大小端的两种实现方式
2017-11-18 15:12
387 查看
一、为什么会有大小端之分
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为 8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。二、定义
大端模式:
大端模式就是指把数据的高字节保存在内存的低地址中,数据的低字节保存在内存的高地址中,这和我们一般的阅读顺序是一致的。小端模式:
小端模式与大端模式相反,数据的高字节位置保存在内存的高地址处,数据的低字节保存在内存的低地址处。这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。图解
画张图简单解释下大小端的区别,比如我们要存取一个0x12345678的数据,在大小端机器的存取方式分别是:三、判断机器大小端方式
①字符指针判断
在32位平台下,int占4个字节,而char类型的指针是占一个字节的,如果我们把int强传为char类型的指针,只会保存一个字节的数据,那么我们只需要判断char里面的第一个字节和int里面的第一个字节是否是一致即可判断。如果一致则为小端模式,反之为大端模式。
注:
下面代码我们令 int a=1 如果是小端模式,int下1会存放在在低地址处,而强传为char类型的指针,1也在低地址处,所以可以判断。#include <iostream> using namespace std; int main() { int a = 1; if (*(char*)&a == 1) cout << "小端模式" << endl; else cout << "大端模式" << endl; return 0; }
如上所示,我的机器是小端机器。
②联合体判断
由于联合体所有数据共享一块地址空间,存放数据的所有成员都是从低地址开始存放,所以我们可以在联合体内定义一个int和一个char类型变量,然后在外部实例化的时候创建int变量,用char变量调用,相当于隐式类型转化,如果结果为1,则低字节存放在低地址,既是小端机器,反之大端机器。#include <iostream> using namespace std; union Test { int a; char b; }; int main() { Test t; t.a = 1; if (t.b == 1) cout << "小端机器" << endl; else cout << "大端机器" << endl; return 0; }
相关文章推荐
- 实现判断机器大小端的两种方法
- 判断机器大小端的两种实现方法
- 判断机器大小端的两种实现方法
- 两种方法实现判断当前机器是大端还是小端
- 判断机器大小端的两种实现方法
- 判断机器大小端的两种实现方法
- 判断机器是用大端还是用小端方式来表示字节序列
- 并行计算实现判断一个数是不是素数--Win32和.Net两种方式结合
- 【腾讯面试题】判断机器的大小端存储方式。
- python 状态机语句"Python is fun"褒贬义判断的两种实现方式
- C语言实现判断大端小端存储方式的代码
- asp.net mvc 实现判断用户是否登录的两种方式
- 判断机器大小端的C语言实现
- java 实现BufferedImage和ImageReader两种方式获取图片宽高、判断图片类型、获取图片大小工具类代码以及测试响应结果
- 并行计算实现判断一个数是不是素数--Win32和.Net两种方式结合
- Go语言实现机器大小端判断代码分享
- jquery、javascript实现(get、post两种方式)跨域解决方法
- MarkDown技巧:两种方式实现页内跳转
- 本地机器大小端判断(本机数据存储形式)
- 实现html锚点的两种方式