大端模式和小端模式的区别以及如何判断大小端
在计算中,字节顺序是指数字的二进制表示内的字节(或有时是位)的顺序。它也可以更普遍地用于指代任何表示的内部排序,例如数字系统中的数字或日期的部分。
在最常见的用法中,字节顺序表示多字节数字内的字节顺序,而大小端字节的排列顺序是相反的。我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
什么是大端模式
先存放最高有效字节,表现为最高有效字节存储在低地址
比如0x123456在内存中的存储方式:
低地址 ----------> 高地址
0x12 | 0x34 | 0x56
什么是小端模式
先存放最低有效字节,表现为最低有效字节存储在低地址
比如0x123456在内存中的存储方式:
低地址 ----------> 高地址
0x56 | 0x34 | 0x12
大小端模式名字的由来
在乔纳森·斯威夫特的著名讽刺小说《格列夫游记》中,小人国内部分裂成Big-endian和Little-endian两派,区别在于一派要求从鸡蛋的大头把鸡蛋打破,另一派要求从鸡蛋的小头把鸡蛋打破。斯威夫特借以讽刺英国的政党之争,在计算机工业中指数据储存顺序的分歧。
大端模式和小端模式的差异
1:大端方便人阅读,而小端方便机器处理
2:小端模式强制转换类型时不需要调整字节内容,直接截取低字节即可;大端模式由于符号位为第一个字节,很方便判断正负。
为什么会出现的大小端
计算机早期硬件设计没有统一的规范,于是就出现了大小端不一致的硬件设计,而且各自发展的都很好,等到万物互联后,数据有了交互,大小端也就成了必须要考虑的问题了。
如何判断大小端模式
1:利用强制类型转换截断
bool IsBigEndian() { short a = 0x1234; char b = *(char*)&a; if (b == 0x12) { return true; } return false; }
2:利用联合体共享内存的特性,截取低地址部分
bool IsBigEndian() { union NUMBER { short a; char b; } number; number.a = 0x1234; if (number.b == 0x12) { return true; } return false; }