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

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

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

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

目录

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

大端模式 

小端模式

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

 三、怎样判断大小端


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

让我们来看一下0x123456在内存中的存储方式

c语言指针内存空间——大小端存储问题_第1张图片 为什么会出现78 56 34 12这种存储顺序呢?这就是大小端的不同存储方式 

大端模式 

  低地址 -----> 高地址
  0x12 | 0x34 | 0x56 

小端模式

  低地址 -----> 高地址
  0x56 | 0x34 | 0x12 
不难看出大端模式比较符合人的直观认识,大小端(Endian)是指数据存储或者传输时的字节序

我们可以通过单字节循环输出查看:

#include 
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;
}

c语言指针内存空间——大小端存储问题_第2张图片

总结起来就是:
小端存储:低位存放在低地址(高位存放在高地址)
大端存储:低位存放在高地址(高位存放在低地址)

 小端存储:由低位到高位存储,由高位到低位输出!

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

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

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

 三、怎样判断大小端

由于指针指向的是内存中的首位地址,通过指针可以进行大小端的判断:
c语言指针内存空间——大小端存储问题_第3张图片

 

你可能感兴趣的:(c语言之路重点知识整合,c语言,开发语言,c++,经验分享)