什么是大端法和小端法?
什么是大端法和小端法?
在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中的最小地址。
例如,假设一个类型为int的变量x的地址为0x100,即&x的值为0x100。那么x的4个字节将被存储在
存储器的0x100,0x101,0x102和0x103的位置。
字节序即为多字节对象存储在内存中的字节顺序,有两种不同的存储方案:大端法和小端法。现代的处理器大多为双端法,大小端都支持,可以配置称大端法或者小端法。
大端法
最高有效字节在最前面的方式称为大端法,例如假设变量x类型为int型,位于地址0x100的地方,其16进制值为0x12345678,地址范围为0x100到0x103字节。
对于大端法的机器来说:
0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|
12 | 34 | 56 | 78 |
由上图可见,地址从左向右增长,x的最高有效字节12在最前面存储。这正好和我们平时书写习惯一致,先书写最高有效字节,再依次写其余字节。
小端法
最低有效字节在最前面的方式成为小端法,这正好和大端法相反,仍然用大端法中举的例子说明:
0x100 | 0x101 | 0x102 | 0x103 |
---|---|---|---|
78 | 56 | 34 | 12 |
由上图可见,地址依然从左向右增长,x的最低有效字节在最前面存储,与大端法相反。
如何判断我的机器是大端法还是小端法?
在《UNIX网络编程》上有一个程序可以判断一个机器是大端法还是小端法,我稍加改造了一下:
#include<stdio.h>
#include<stdlib.h>int
main(int argc, char **argv)
{union {short s;char c[sizeof(short)];} un;un.s = 0x0102;if (sizeof(short) == 2) {if (un.c[0] == 1 && un.c[1] == 2)printf("大端法\n");else if (un.c[0] == 2 && un.c[1] == 1)printf("小端法\n");elseprintf("不能判断\n");} elseprintf("sizeof(short) = %d\n", sizeof(short));exit(0);
}
大端法和小端法对程序员有什么影响?
多数程序员不必关系所使用的机器是大端法还是小端法,在大多数情况下都不会出问题,但在某些特殊情况下这有可能成为问题:
1.编写网络程序时,主机之间通过网络相互通信,不同主机之间可能采用不同的方法,而且网络字节序和主机字节序也可能不同。
当小端法机器产生的数据被发送到大端法机器或者反方向发送时会发现接受程序子里面的字节成了反序的。为了避免这种情况的发
生,规定网络应用程序在将数据发送之前现将数据转换称网络字节序,在接收主机那边,主机再将网络字节序的数据转换成适合本
主机的主机字节序,从而避免了字节序异常。(网络字节序为大端法)
网络编程中常用的转换函数有如下几个:
uing16_t htons(uint16_t host16bitvalue); // 参数为16位主机字节序的值,返回值是16位网络字节序的值uint32_t htonl(uint32_t host32bitvalue); // 参数为32位主机字节序的值,返回值是32位网络字节序的值uint16_t ntohs(uint16_t net16bitvalue); // 参数为16位网络字节序的值,返回值是16位主机字节序的值uint32_t ntohl(uint32_t net32bitvalue); // 参数为16位网络字节序的值,返回值是16位主机字节序的值
2.当调试程序时常常需要将程序编译成汇编形式,当阅读汇编代码时数据的字节序很重要,需要根据自己的机器是大端法还是小
端法来不同对待,以免搞错字节顺序。
3.当编写规避正常类型系统的程序时,在C语言中可以使用强制类型转换来允许以一中类型引用一个对象,而这种数据类型与创建
这个对象时定义的数据类型不同,大多数应用编程都不推荐这种编码技巧,但是它们对于系统级编程来说十分有用。
bool_ | 布尔型数据类型(True 或者 False) |
---|---|
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
int8 | 字节(-128 to 127) |
int16 | 整数(-32768 to 32767) |
int32 | 整数(-2147483648 to 2147483647) |
int64 | 整数(-9223372036854775808 to 9223372036854775807) |
uint8 | 无符号整数(0 to 255) |
uint16 | 无符号整数(0 to 65535) |
uint32 | 无符号整数(0 to 4294967295) |
uint64 | 无符号整数(0 to 18446744073709551615) |
float_ | float64 类型的简写 |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ | complex128 类型的简写,即 128 位复数 |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
什么是大端法和小端法?相关推荐
- 小端模式和大端模式_计算机字节顺序(大端法和小端法)详解
首先理清一下基本的概念: 1. 大多数机器使用时的8位的块(一个字节),作为可寻址的最小单位, 2. 机器级程序将内存视为非常大的字节数组(虚拟内存),内存的每个字节都由一个唯一的数字来表示(如下X的 ...
- 读csapp有感:大端法,小端法
2019独角兽企业重金招聘Python工程师标准>>> 先介绍什么是大端法,小端法. 就是根据字节顺序在内存中的排列顺序的差异的两种标准,小端法指的是机器选择在存储器重按照从低有效字 ...
- 网络传输大端序_基于大端法、小端法以及网络字节序的深入理解
关于字节序(大端法.小端法)的定义<UNXI网络编程>定义:术语"小端"和"大端"表示多字节值的哪一端(小端或大端)存储在该值的起始地址.小端存在起 ...
- 关于字节序(大端法、小端法)的定义
关于字节序(大端法.小端法)的定义 <UNXI网络编程>定义:术语"小端"和"大端"表示多字节值的哪一端(小端或大端)存储在该值的起始地址.小端存在 ...
- 小端法、大端法、网络字节转序
1.小端法(Little-Endian)就是低位字节排放在内存的低地址端即该值的起始地址,高位字节排放在内存的高地址端. 2.大端法(Big-Endian)就是高位字节排放在内存的低地址端即该值的起 ...
- 使用c语言测试大端和小端,C语言*符号使用及大端法小端法测试
工具:Microsoft Visual C++ 6.0 例子: int a = 1; int* b = &a; C语言规定a表示存储单元中的数据,&a表示存储单元的地址,b存储的就是a ...
- 网络通信之 字节序转换原理与网络字节序、大端和小端模式
一.在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换. 原因如下:网络协议规定接收到得第一个字节是高字节, ...
- 网络通信时字节序转换原理与网络字节序、大端和小端模式 .
引言:在进行网络通信时是否需要进行字节序转换? 相同字节序的平台在进行网络通信时可以不进行字节序转换,但是跨平台进行网络数据通信时必须进行字节序转换.原因如下:网络协议规定接收到得第一个字节是高字节, ...
- 计算机系统-理论-内存读取/大端法小端法
8086是按照下面这个内存模型来看待内存的 8086在加电的时候,默认读取CS=F000,IP=0地址出的值,也就是上图中黄色部分,那里固化了开机时需要执行的指令,在ROM区 内存读取:在一块连续的内 ...
最新文章
- 爱奇艺java 架构师_爱奇艺个性化实时推荐系统整体流程图 拿去细品
- 0x13链表与邻接表之邻值查找
- jira 插件介绍地址
- pygame碰撞检测
- gwt-2.8.2下载_GWT 2 Spring 3 JPA 2 Hibernate 3.5教程
- access设置0字段为null是因为类型转换失败_Apache Pulsar 2.6.1 版本正式发布:2.6.0 加强版,新增 OAuth2 支持
- Npm安装node-sass包依赖时报错 Cannot download “https://github.com/sass/node-sass/releases/download
- FBI或被允许隐瞒解锁iPhone技术 不向苹果公开
- 网页预览时,仿宋_GB2312 字体不能正确显示,uni-app移动端字体不显示
- 记一款价廉物美的小型DAC+耳放----Dr.DAC
- chart.js使用学习——折线图(2:常用属性设置)
- python计算三角形的周长和面积
- linux驱动更新软件下载,NVIDIA英伟达显卡驱动程序更新下载(32/64位) v384.90 Linux版...
- 技术寡头争霸传之:控制开源工具,就控制了整个生态
- CDH6.2.1安装Kudu maste无法启动 Unable to initialize catalog manager
- android十大开源项目
- 智慧实验室综合安全管理系统(高校版)、危化品管理、设备预约等
- 【路径规划】基于遗传算法求解多中心VRP问题matlab源码
- 关于极光推送报错6003的一些问题
- 【学习笔记】| 集合泛型