CPU处理器大小端笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_37127273/article/details/84023818

CPU 处理器大小端笔记

前言

CPU的大小端问题,在进行网络协议开发和跨平台开发的时候,是不可避免会遇到的问题,了解清楚了大小端问题,会更好的设计和使用通信协议。

大小端说明

存储器中对数据的存储是以字节(Byte)为基本单位的,因此,字(Word)和半字(Half-Word)在存储器中就有两种次序,分别称为:大端模式(Big Endian)和小端模式(Little Endian)。

如果要在一个 int 型 四字节的变量中存放一个数值是 0x12345678的数据。大小端的CPU的存放形式如下。

大端(高尾端)

低地址存放高字节数据

内存地址 数据
0x0000 0x12
0x0001 0x34
0x0002 0x56
0x0003 0x78

大端字节序 也被用于 TCP/IP协议上,因此也称作 网络字节序。

小端(低尾端)

低地址存放低字节数据

内存地址 数据
0x0000 0x78
0x0001 0x56
0x0002 0x34
0x0003 0x12

如何记忆

在数据存储过程中,总是从存储器的低地址开始存储的。

假设一个 int 型四字节的变量的存储起始地址为0x0,那么如果要存储一个变量,该类型的数据会占用4个字节,内存地址从0x0~0x3。

如果要存储一个数值为 0x12345678 的数据。

如果采用大端方式存储,那么会将数据的高字节先存入首地址,然后依次存储。

既将 0x12 存储到 0x00 中

将 0x34 存储到 0x01 中

将 0x56 存储到 0x02 中

将 0x78 存储到 0x03 中

内存地址 数据
0x0000 0x12
0x0001 0x34
0x0002 0x56
0x0003 0x78

如果采用小端方式存储,那么会将数据的低字节先存入首地址,然后依次存储。

既将 0x78 存储到 0x00 中

将 0x56 存储到 0x01 中

将 0x34 存储到 0x02 中

将 0x12 存储到 0x03 中

内存地址 数据
0x0000 0x78
0x0001 0x56
0x0002 0x34
0x0003 0x12

使用C语言联合体判断一个处理器采用大端存储还是小端存储

#include "stdio.h"
int main()
{
  union w
 {
  int a;  //4 bytes
  char b; //1 byte
 } c;
  c.a=1;
  if (c.b==1)
  printf("It is Little_endian!\n");
  else
  printf("It is Big_endian!\n");
  return 1;
}


参考资料链接

轻松记住大端小端的含义

猜你喜欢

转载自blog.csdn.net/weixin_37127273/article/details/84023818