字节顺序
字节存储顺序分为大端存储,小端存储
大端存储,是将数据的低位字节放到高地址处,高位字节放到低地址处。
小端存储,是将数据的低位字节放到低地址处,高位字节放到高地址处。
具体讨论字节顺序之前,我想先明白两个概念
1.内存地址高低
所谓高地址和低地址在内存中究竟是怎样表示的
0x04000003
0x04000002
0x04000001
0x04000000
问1:对于0x04000000到0x04000003那个是相对更高的地址?
答1:0x04000003是相对更高的地址,因为为了方便管理内存,人为给内存进行编号,值较大的地址是高地址,值较小的地址是低地址 。
2.数据字节的高低位
书中给了一个32位的整数0x12345678
问2:0x12的部分表示高位,还是0x78的部分表示高位?
先不急着回答这个问题,这个32位的整数是十六进制的,我们想一个十进制的 。
问3:12345678中那个是最高位,那个是最低位?
答3:显然1是最高位,是千万位,8是最低为,是个位。
我们都知道12345678可以表示为110000000+21000000+3100000+410000+51000+6100+710+81
那现在谁是高位,谁是低位就很明白了吧。
答2:0x12的部分表示高位
大小端存储示例
0x12345678他在内存中占用四个字节,现有两种内存存放方式:
第一种;
内存地址 数值
0x04000003 0x78
0x04000002 0x56
0x04000001 0x34
0x04000000 0x12
第二种
内存地址 数值
0x04000003 0x12
0x04000002 0x34
0x04000001 0x56
0x04000000 0x78
问4:上诉两种数据在内存中的存放方式分别是什么?
答4:第一种是高位数据存放在低地址,低位数据存放在高地址,属于大端存储;第二种是低位数据存放在低地址,高位数据存放在高地址,属于小端存储
大端小端指的是什么
我在思考small endian和big endian在取名时是从什么角度来说明的。
计算机数据读取顺序
问:计算机数据读取顺序是什么,是从哪里开始读取一个数据,本例来看,是从0x04000000开始读取还是从0x04000004开始读取。大端存储和小端存储在读取顺序上有什么不同!
答:无论是大端存储还是小端存储都是从低地址开始读,区别只在于,低地址存放数据顺序不同。
注:读取顺序与存储顺序是两个不同的概念。
最后解答大小端
大端存储和小端存储指的是数据字节的高位和低位。
如果计算机采用大端存储,则高位字节数据存储在低地址。
如果计算机采用小端存储,则低位字节数据存储在低地址。
代码练习
touch practice1.c
首先用touch命令创建一个c程序
用nano编辑器(如果有好用的编辑器,求推荐)打开practice1.c
编辑代码
用gcc 编译
运行该文件
输出A,说明该ubuntu的cpu采用的是小端存储,低位数据存储在低地址。