程序员社区

大端与小端

在乔纳森·斯威夫特的著名讽刺小说《格列夫游记》中,小人国内部分裂成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数组的转换,这里会自动把小端转换成大端,所以不需要先在结构体中转换大小端

赞(0) 打赏
未经允许不得转载:IDEA激活码 » 大端与小端

相关推荐

  • 暂无文章

一个分享Java & Python知识的社区