创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ
目录
一、什么是大端,什么是小端
让我们来看一下0x123456在内存中的存储方式
为什么会出现78 56 34 12这种存储顺序呢?这就是大小端的不同存储方式
大端模式
低地址 -----> 高地址
0x12 | 0x34 | 0x56
小端模式
低地址 -----> 高地址
0x56 | 0x34 | 0x12
不难看出大端模式比较符合人的直观认识,大小端(Endian)是指数据存储或者传输时的字节序
我们可以通过单字节循环输出查看:
#include <stdio.h>
int main()
{
int a = 0x12345678;
char* p1 = &a;
int* pi = &a;
short* p2 = &a;
printf("小端存储在内存中格式:87 65 43 21\n");
printf("char*单字节输出:\n");
for (int i = 0; i < 4; i++) {
printf("\t%hhx\n", *p1);
p1++;
}
printf("int*正常输出:%x\n", *pi);
printf("short*双字节输出:\n");
for (int i = 0; i < 2; i++)
{
printf("\t%hx\n", *p2);
p2++;
}
printf("小端存储:由低位到高位在内存中存储,由高位到低位输出\n");
return 0;
}
总结起来就是:
小端存储:低位存放在低地址(高位存放在高地址)
大端存储:低位存放在高地址(高位存放在低地址)
小端存储:由低位到高位存储,由高位到低位输出!
二、为什么会出现大小端存储之分
1. 一开始是由于不同架构的CPU处理多个字节数据的顺序不一样,比如x86的是小段模式,KEIL C51是大端模式。但是后来互联网流行,TCP/IP协议规定为大端模式,为了跨平台通信,还专门出了网络字节序和主机字节序之间的转换接口(ntohs、htons、ntohl、htonl)
2. 大小端模式各有优势:小端模式强制转换类型时不需要调整字节内容,直接截取低字节即可;大端模式由于符号位为第一个字节,很方便判断正负。
三、怎样判断大小端
由于指针指向的是内存中的首位地址,通过指针可以进行大小端的判断: