版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
}