大端法与小端法
2016-07-14 10:05
218 查看
一、什么是字节序
字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。
高/低地址: 指的是内存的高、低地址,计算机在内存中存放数据的顺序都是从低地址到高地址
高/低字节:有些文章中称低位字节为最低有效位,高位字节为最高有效位。如果我们有一个32位无符号整型0x12345678,那么高位是什么,低位又是什么呢?
其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。
[b]第一部分 基本概念
[/b]
首先不管是大端法还是小端法存储,计算机在内存中存放数据的顺序都是从低地址到高地址,所不同的是首先取低字节的数据存放在低地址还是取高字节数据存放在低地址。
若首先取高字节的数据存放在低地址,则是大端法;
若首先取低字节的数据存放在低地址,则是小端法;
例如有数据0x01234567 (注意:左边是高字节,右边是低字节)
大端法存放:
存放的地址依次为:0x0001 0x0002 0x0003 0x0004
对应的数据依次为:0x01 0x23 0x45 0x67
小端法存放:
存放的地址依次为:0x0001 0x0002 0x0003 0x0004
对应的数据依次为:0x67 0x45 0x23 0x01
第二部分 判断一个机器是大端存放还是小端法存放
知道了大端和小端的定义,我们很容易写代码判断一个机器是大端还是小端:
int main(int argc, char* argv[])
{
union w
{
int a;
char b;
}c;
c.a = 0x0001;
if(c.b==1)
printf("small endian\n");
else if(c.b==0)
printf("big endian\n");
else
printf("error\n");
return 0;
}
注意:之所以可以这样写来判断是因为共用体中所有成员的存放顺序是从低地址开始的。
下面一个程序也可以来判断机器的字节序:
#include <iostream>
using namespace std;
int main()
{
int x=0x00001234;//十进制为4660
char tp=*((char*)&x);//取tp等于x的低地址部分
//char tp=(char)x;这样也是可以的。
if (tp==0x00)//如果低地址部分取出的值是高字节的值,则为大端
{
cout<<tp<<"大端"<<endl;
}
else
if (tp==0x34)//如果低地址部分取出的值是低字节的值,则为小端
{
cout<<tp<<"小端"<<endl;//0x34即十进制52,所以输出tp值为4
}//注:本人电脑小端
return 0;
}
字节序,顾名思义字节的顺序,再多说两句就是大于一个字节类型的数据在内存中的存放顺序(一个字节的数据当然就无需谈顺序的问题了)。
高/低地址: 指的是内存的高、低地址,计算机在内存中存放数据的顺序都是从低地址到高地址
高/低字节:有些文章中称低位字节为最低有效位,高位字节为最高有效位。如果我们有一个32位无符号整型0x12345678,那么高位是什么,低位又是什么呢?
其实很简单。在十进制中我们都说靠左边的是高位,靠右边的是低位,在其他进制也是如此。就拿 0x12345678来说,从高位到低位的字节依次是0x12、0x34、0x56和0x78。
[b]第一部分 基本概念
[/b]
首先不管是大端法还是小端法存储,计算机在内存中存放数据的顺序都是从低地址到高地址,所不同的是首先取低字节的数据存放在低地址还是取高字节数据存放在低地址。
若首先取高字节的数据存放在低地址,则是大端法;
若首先取低字节的数据存放在低地址,则是小端法;
例如有数据0x01234567 (注意:左边是高字节,右边是低字节)
大端法存放:
存放的地址依次为:0x0001 0x0002 0x0003 0x0004
对应的数据依次为:0x01 0x23 0x45 0x67
小端法存放:
存放的地址依次为:0x0001 0x0002 0x0003 0x0004
对应的数据依次为:0x67 0x45 0x23 0x01
第二部分 判断一个机器是大端存放还是小端法存放
知道了大端和小端的定义,我们很容易写代码判断一个机器是大端还是小端:
int main(int argc, char* argv[])
{
union w
{
int a;
char b;
}c;
c.a = 0x0001;
if(c.b==1)
printf("small endian\n");
else if(c.b==0)
printf("big endian\n");
else
printf("error\n");
return 0;
}
注意:之所以可以这样写来判断是因为共用体中所有成员的存放顺序是从低地址开始的。
下面一个程序也可以来判断机器的字节序:
#include <iostream>
using namespace std;
int main()
{
int x=0x00001234;//十进制为4660
char tp=*((char*)&x);//取tp等于x的低地址部分
//char tp=(char)x;这样也是可以的。
if (tp==0x00)//如果低地址部分取出的值是高字节的值,则为大端
{
cout<<tp<<"大端"<<endl;
}
else
if (tp==0x34)//如果低地址部分取出的值是低字节的值,则为小端
{
cout<<tp<<"小端"<<endl;//0x34即十进制52,所以输出tp值为4
}//注:本人电脑小端
return 0;
}
相关文章推荐
- Mac机测试应用程序内存溢出的工具-Xcode Instrument
- Jquery实现遮罩层的简单实例(就是弹出DIV周围都灰色不能操作)
- 语音提示
- 一路走来---大二这一年
- labview实现字符串转16进制
- scp命令的用法详解
- linux安装jdk
- 不知道这些,加薪也是白加!
- Android 解析XML 文件的四种方法总结
- EXT4 form 表单内控件输入无效时不出现提示的原因
- 解决react-native 创建工程、init过程太慢的问题
- @RequestBody和@ResponseBody
- DataTable跳转到指定页
- 帝国cms会员查看权限设置方法
- 设计模式--原型模式
- MySQL存储过程中的3种循环
- 如何由jdk的安装版本改成非安装版本
- CSS3盒子模型
- smb.conf
- Map输出方式二:foreach输出Map