大端法(big endian) 小端法(small endian)
来源:互联网 发布:行尸走肉第八季 知乎 编辑:程序博客网 时间:2024/06/06 04:07
基本概念
不管是大端法还是小端法存储,计算机在内存中存放数据的顺序都是从低地址到高地址,所不同的是首先取低字节的数据存放在低地址还是取高字节数据存放在低地址。
若首先取高字节的数据存放在低地址,则是大端法;
若首先取低字节的数据存放在低地址,则是小端法;
为什么会有大端法与小端法
答案是,计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,计算机的内部处理都是小端字节序。
但是,人类还是习惯读写大端字节序。所以,除了计算机的内部处理,其他的场合几乎都是大端字节序,比如网络传输和文件储存。
优缺点
大端小端没有谁优谁劣,各自优势便是对方劣势:
小端模式 :强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样。
大端模式 :因为符号位的判定固定为第一个字节,容易判断正负。
转换
举例来说,处理器读入一个16位整数。如果是大端字节序,就按下面的方式转成值。
x = buf[offset] * 256 + buf[offset+1];
上面代码中,buf是整个数据块在内存中的起始地址,offset是当前正在读取的位置。第一个字节乘以256,再加上第二个字节,就是大端字节序的值,这个式子可以用逻辑运算符改写。
x = buf[offset]<<8 | buf[offset+1];
上面代码中,第一个字节左移8位(即后面添8个0),然后再与第二个字节进行或运算。
如果是小端字节序,用下面的公式转成值。
x = buf[offset+1] * 256 + buf[offset];
32位整数的求值公式也是一样的。
大端字节序 i = (data[3]<<0) | (data[2]<<8) | (data[1]<<16) | (data[0]<<24);
小端字节序 i = (data[0]<<0) | (data[1]<<8) | (data[2]<<16) | (data[3]<<24);
程序验证
1.共用体
知道了大端和小端的定义,我们很容易写代码判断一个机器是大端还是小端:
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;}
2.指针转换
int main(int argc, char *argv[]){ unsigned int num = 0xff; unsigned char *p = # if(*p == 0xff) printf("small endian\n"); else if(*p == 0) printf("big endian\n"); else printf("error\n"); return 0;}
参考
http://www.ruanyifeng.com/blog/2016/11/byte-order.html
http://blog.csdn.net/ce123_zhouwei/article/details/6971544
- 大端法(big endian) 小端法(small endian)
- MSB LSB 大端 小端 Big-Endian Small-Endian
- Big Endian and Small Endian
- 小端(Little Endian) 大端(Big Endian)
- 大端(big endian)小端(little endian)
- 大端Big-Endian 、小端Little-Endian
- BIG Endian 和 Little Endian(small endian)模式的区别
- 字节序(Endian),大端(Big-Endian),小端(Little-Endian)
- 字节序(Endian),大端(Big-Endian),小端(Little-Endian)
- 字节序(Endian)、大端(Big-Endian)、小端(little-Endian)
- 大端 小端 big endian
- 关于MSB/LSB Big-Endian/Small-Endian的区别
- BIG Endian 和 Small Endian模式的区别
- BIG Endian 与 Small Endian --大小端模式的区别
- 关于big-enidan和small-endian
- 大端(Big Endian)与小端(Little Endian)详解
- 大端(Big Endian)与小端(Little Endian)详解
- 分析 大端(Big Endian)和小端(Little Endian)
- 阿里云centos安装mysql server
- Android Parcel源码笔记
- 自研php的仿java的ssh框架
- Dubbo入门使用
- 特性操作、获取、删除、增加等
- 大端法(big endian) 小端法(small endian)
- 制作Linux U盘启动(不只装机)盘(Ubuntu为例)
- Mysql优化3-数据库Sql优化
- Vim中 ctags 跳转直接跳到第一个匹配行的问题
- JQ的事件处理
- windows版atom的Markdown语言支持的一点问题
- Windows和Ubuntu下Django环境搭建
- 【CSS优先级与!important】
- 选择排序与冒泡排序