1 大小端的来源
存储器中对数据的存储是以字节(Byte)为基本单位的,
当CPU处理的位数和数据类型的宽度不一致或者处理的位数大于一个字节的时候,需要考虑处理数据的存顺序。
举例来说:
1)32位的处理器,存储8位的char型数据;
2)32位的处理器,存储32位的int型数据;
而大小端只是表示存储数据的两种顺序方式,默认内存的读写方式是从低位到高位,处理数据是低位在地址低位,还是高位在地址低位,分为小端和大端两种模式。
因为最开始制定时,没有统一的标准,因而导致了大端和小端两种模式。
同时,什么时候需要注意大端和小端模式呢?
一般是涉及到按位对数据进行处理、网络数据在不同CPU上传输的时候,考虑解析数据的顺序时候;
2 大小端的规则
大端模式:指数据的高字节保存在内存的低地址中
小端模式:指数据的高字节保存在内存的高地址中
1)32位的处理器,存储8位的char型数据;
假设char变量可以存储的地址范围为0x00000001-0x00000004(32位系统中00000000代表32位),那么char是存储在0x00000001那里还是0x00000004那里呢?
很显然,如果CPU是小端模式,那么char是存储在0x00000001当中,如果是大端模式,那么char是存储在0x00000004当中。
2)32位系统,存储32位的int型数据(0x12345678);
大端(高尾端)大端字节序 也被用于 TCP/IP协议上,因此也称作网络字节序。
内存地址 数据
0x0000 0x12
0x0001 0x34
0x0002 0x56
0x0003 0x78
小端(低尾端)
低地址存放低字节数据
内存地址 数据
0x0000 0x78
0x0001 0x56
0x0002 0x34
0x0003 0x12
3 主流CPU的大小端模式
大小端主要由CPU 决定,但是如ARM可以选择大小端模式,准确说是由运行环境决定大小端模式。
可以通过向内存写多字节数据,然后按照内存由小到大的数据读取,判断大小端模式。
1)就CPU架构而言
小端模式:STM32 X86
大端模式:PowerPC IBM Sun
ARM 既可以是小端也可以是大端。
Intel的80x86系列芯片是唯一还在坚持使用小端的芯片,ARM芯片默认采用小端,但可以切换为大端;而MIPS等芯片要么采用全部大端的方式储存,要么提供选项支持大端——可以在大小端之间切换。
2) 一些国产CPU的大小端模式
待补充
参考文章:https://blog.csdn.net/qq_38158479/article/details/101562835
https://blog.csdn.net/weixin_37127273/article/details/84023818