字符型数组在内存中的存储

#include <stdio.h>
int main (void)
{
	union b
	{
		short k;  //测试环境short占2字节
		char i[2];  //测试环境char占1字节
	}*s,a;
	s=&a;
	s->i[0]=0x41;
	s->i[1]=0x52;
	printf("%x\n",s->k);
	return 0;
}

今天做题做了一道很怪异的题目,下面是代码,大家可以先猜一下答案。


本人一开始认为运行结果应该为 4152 ,但是在VS2008运行得出的结果竟然是 5241,咦,奇怪,怎么会反过来了呢?

经过一番测试,搜索。发现这个问题涉及到数据在内存存储的问题,也就是字节序的问题(点我查看更多关于字节序的介绍),原来在大部分的机器里面存储字符型数组是在内存中是按照从低位到高位的存储的,就是“0x41”放在内存的低位,“0x52”放到内存的高位,从数组的角度讲就是i[0]存到最低端,然后从低到高一直存。也就是下表的顺序

0x520x41

数据在内存中的存储都是二进制的,而且是八位一个字节的。所以i[2]在内存中实际存储为

0101001001000001


由于在共用体里面只能是多选一的,所以变量k的值也是上表一模一样的。转换成16进制数就是 5241 。

这段程序一开始的运行结果容易给人一种假象,就是这段代码把2个数颠倒输出的,其实输出的数就是个“0101001001000001”转化而成的16进制数5241。

这题虽然有点古怪,起码自己编程是不会这样写的,但是通过仔细研究,却了解了数据在内存中是怎样存放的。重在过程。


以上全部是本人的肤浅了解,如有错误,欢迎指出。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值