一、什么是大端,什么是小端

0x123456 在内存中的存储方式

  • 大端模式
  1. 低地址 -----> 高地址
  2. 0x12 | 0x34 | 0x56
  • 小端模式
  1. 低地址 -----> 高地址
  2. 0x56 | 0x34 | 0x12

不难看出大端模式比较符合人的直观认识

二、为什么会有大小端之分

  1. 一开始是由于不同架构的 CPU 处理多个字节数据的顺序不一样,比如 x86 的是小段模式,KEIL C51 是大端模式。但是后来互联网流行,TCP/IP 协议规定为大端模式,为了跨平台通信,还专门出了网络字节序和主机字节序之间的转换接口(ntohs、htons、ntohl、htonl)

  2. 大小端模式各有优势:小端模式强制转换类型时不需要调整字节内容,直接截取低字节即可;大端模式由于符号位为第一个字节,很方便判断正负。

三、怎样判断大小端

基本思想室根据数据截断来判断是大端还是小端

1、通过强制类型转换截断

  1. BOOL IsBigEndian()
  2. {
  3. short a = 0x1234;
  4. char b = *(char*)&a;
  5. if(0x12 == b)
  6. {
  7. return TRUE;
  8. }
  9. return FALSE;
  10. }

2、利用联合体共享内存的特性,截取低地址部分

  1. BOOL IsBigEndian()
  2. {
  3. union NUM
  4. {
  5. short a;
  6. char b;
  7. }num;
  8. num.a = 0x1234;
  9. if(0x12 == num.b)
  10. {
  11. return TRUE;
  12. }
  13. return FALSE;
  14. }

https://zhuanlan.zhihu.com/p/97821726