大端存储模式:是指数据的低字节保存在内存的高地址位,而数据的高字节保存在内存的低地址位。

小端存储模式:是指数据的低字节保存在内存的低地址,而数据的高字节保存在内存的高地址位。

例如存放0x0001在CPU内存中的存放方式(假设从地址0x4000开始存放)为:

  0x0001   高字节《——————低字节

                低地址   ——————》高地址

内存地址

       0x4000

       0x4001

存储内容(大端)

       0x00

       0x01

存储内容(小端)

       0x01

         0x00

 大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储的模式有点儿类似于把数据当作字符串顺序来处理:地址由小到大增加,高数据是高位向地位放。

小端模式:是指数据的低字节保存在内存的低地址中,数据的高字节在内存的高地址中。

2.为什么会有大小端之分

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是C语言中除了8bit的char之外,还有16bit的short型(要看具体编译器),另外,对于位数大于位的处理器,例如16为或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就就导致了大端模式和小端模式。

例如一个16bit的short型。在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,0x11存放低地址中,0x22存放在高地址中,小端模式,是正好相反。

我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的·ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。

Java中大小端是反着读还是反着存 大小端存放_Java中大小端是反着读还是反着存

 

 

Java中大小端是反着读还是反着存 大小端存放_Java中大小端是反着读还是反着存_02

从图中可以看出a在计算中存储的是以补码的形式,但是顺序确是倒放着的,这是继就是小端模式。

程序中一个变量的地址是指这个变量的起始地址,也就是低地址。例如4字节的int型变量的地址就是变量的起始地址,即这4字节变量对应的地址空间中的最低地址。

网络字节序

程序中一个变量的的地址是指这个变量的起始地址,也就是低地址。例如4字节int型变量的地址就是变量中的起始地址,即这4字节地址空间中的最低地址。

而网络发送时,是从起始地址开始操作处理变量数据的,因此会先传输变量的低地址数据,后传输高地址数据。

网络上传输数据的字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作为高地址字节还是地位字节处理,是一个比较有意义的问题:

UDP/TCP/IP协议规定,把接收到的第一个字节当作高字节来看待,这就要求发送端发送的第一个字节是高位字节,而在发送段发送数据时,发送的第一个字节时该数值在内存的起始地址对应的哪个字节,也就是说,该数值在内存中起始地址对应的哪个字节就是要发送的一个高位字节(即高位字节存放在低地址中,低位字节高地址中);由此可见,多字节数值在发送之前,在内存中因该时大端法方式进行存放的。

所以说网络字节序是大端字节序,在实际中,当在两个存储方式不同的主机上传输时,需要借助字节序转换函数

Java中大小端是反着读还是反着存 大小端存放_小端模式_03