大端与小端
作者:互联网
在乔纳森·斯威夫特的著名讽刺小说《格列夫游记》中,小人国内部分裂成Big-endian和Little-endian两派,区别在于一派要求从鸡蛋的大头把鸡蛋打破,另一派要求从鸡蛋的小头把鸡蛋打破。斯威夫特借以讽刺英国的政党之争,在计算机工业中指数据储存顺序的分歧
大端与小端
大端
数据的高字节,保存在内存的低地址中,数据的低字节,保存在内存的高地址中,而数据的取出使用是从低地址开始的,所以大端数据相当于从高字节取出使用
小端
数据的低字节,保存在内存的低地址中,数据的高字节,保存在内存的高地址中,而数据的取出使用是从低地址开始的,所以小端数据相当于从低字节取出使用
为什么会有大小端模式之分
因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于 8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式
用法
Intel的80x86芯片是唯一还在坚持使用小端的芯片,所以使用此芯片的电脑采用小端存储,而网络上传输的数据采用的是大端,所以需要大小端转换
word length = 0x1234; //电脑上定义的变量length是小端存储
word len = swapWord(length); //通过方法swapWord()变成大端存储,len就是大端存储,它就可以在网络中使用
注意
- 大端小端是对于大于一个byte的数字才有的,如word,dword,int,long等,而byte是没有大小端之分的
- Capl中定义的数字(大于byte)是小端,如果想在网络中使用,需要转换为大端
- 网络中取出的数字(大于byte)是大端,如果想在capl中使用(存储,显示),需要转换为小端
- memcpy_h2n(byte dest[], struct source)函数可以实现结构体到byte数组的转换,这里会自动把小端转换成大端,所以不需要先在结构体中转换大小端
标签:小端,存储,字节,地址,大端,byte 来源: https://blog.csdn.net/wjz110201/article/details/115010373