• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
TianXiCoding
博客园    首页    新随笔    联系   管理    订阅  订阅
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. 大小端模式各有优势:小端模式强制转换类型时不需要调整字节内容,直接截取低字节即可;大端模式由于符号位为第一个字节,很方便判断正负。

 三、怎样判断大小端

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

 

posted on 2023-04-07 10:30  天喜Studio  阅读(97)  评论(0)    收藏  举报  来源
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3