大端小端

1、概念

对于一个由2个字节组成的16位整数,在内存中存储这两个字节有两种方法:

一种是将低序字节存储在起始地址,这称为小端(little-endian)字节序;

另一种方法是将高序字节存储在起始地址,这称为大端(big-endian)字节序。

如123  1就是高序字节 3就是低序字节

 

2、为什么会出现大端小端两种模式?

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如果将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。例如一个16bit的short型x,在内存中的地址为0x0010,x的值为0x1122,那么0x11为高字节,0x22为低字节。对于大端模式,就将0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。小端模式,刚好相反。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。一般操作系统都是小端,而通讯协议是大端的。
  在iOS中是小端模式

 

3、大端和小端也可以翻译为“高尾端”和“低尾端”

这就好理解了:如果把一个数看成一个字符串,比如11223344 它的尾端很显然是44,看它是高尾端还是低尾端就看尾端放在高地址还是低地址,它在内存中的放法非常直观,如下图:

 

 

下面在项目中查看数据在内存中的存放情况:

如上图所示,创建一个对象,然后给两个成员变量赋值。

那么他的内存结构应该是前面八个字节是isa指针  后面四个字节是存放no变量值的  再接下来四个字节是存放age变量值的

no 4在内存中存储形式应为:ox00 00 00 04

age 5在内存中存储形式应为:ox00 00 00 05

04  05  为尾端 是低序字节  写在了低地址位  所以为小端模式

下面内存结构如图:(内存地址从左往右依次递增的)

 

在读取的时候也是,低地址位的数据读取出来后放到低序字节 然后内存依次往后读取,数据依次放到高序字节位

 

下面两篇文章介绍的较为详细:

参考资料1

参考资料2

 

posted @ 2019-04-09 17:13  高晓牛  阅读(1940)  评论(0编辑  收藏  举报