> 文章列表 > c语言指针内存空间——大小端存储问题

c语言指针内存空间——大小端存储问题

c语言指针内存空间——大小端存储问题

创作不易,本篇文章如果帮助到了你,还请点赞支持一下♡>𖥦<)!! 

主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!

给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

目录

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

大端模式 

小端模式

二、为什么会出现大小端存储之分 

 三、怎样判断大小端


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

让我们来看一下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. 大小端模式各有优势:小端模式强制转换类型时不需要调整字节内容,直接截取低字节即可;大端模式由于符号位为第一个字节,很方便判断正负。

 三、怎样判断大小端

由于指针指向的是内存中的首位地址,通过指针可以进行大小端的判断: