C语言(小专题)—大小端存储的问题

文章通过一个C语言程序演示了如何判断主机是大端存储还是小端存储,解释了多字节数据在不同存储方式下的排列,并讨论了16进制数据在内存中的表示以及ASCII码与字符的关系。示例代码在小端存储的主机上会输出小端,并提到一个可能的输出情况,涉及字符串打印和内存解析的知识。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不同类型的CPU和操作系统对多字节数据例如int、short、long的存储方式可能不一样,分为大端存储和小端存储
这里所说的多字节是指连续的多字节数据,也即多字节数据作为一个整体的时候。对于字符串或者数组存储多字节数据的时候,例如char s[6] = "hello"; 不论是大端或者是小段存储,h一定在地址的第一位
对于小端存储的主机 数据低位存储在地址低位
对于大端存储的主机 数据低位存储在地址高位
下图距离以16进制(0x)为例,因为两位正好对应一个字节。
在这里插入图片描述
在这里用一个简单的程序,判断所使用的主机是大端存储还是小端存储

1 #include <stdio.h>
2 int main(){
3 int a = 0x12345678;
4 char *p = (char *)&a; //*p只能操作一个字节 存储的是地址低位0x78
5 if(0x78 == *p){
6 printf("小端\n");
7 }else if(0x12 == *p){
8 printf("大端\n");
9 }
10 return 0;
11 }

请思考:
小端存储的主机上,下面的代码会输出什么?

1 int m = 0x41424344;
2 printf("%s\n", &m);//DCBA+不确定的

在这里涉及到的知识点:大小端存储问题、16进制数据如何存入内存、16进制如何转换成10进制、常见字符对应的ASCII码(十进制 65对应A)、printf(“%s\n”,&m)对应输出字符串要的是首地址(从首地址到\0结束),取地址&num取的是编号最小的首地址
在这里插入图片描述
将数字以字符的形式输出会输出这个数字对应的ASCII码(对应的字符),这里将十六进制转化为十进制是因为我们需要记住十进制的ASCII码对应的字符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值