空中城堡在哪个网播放:c语言问题

来源:百度文库 编辑:高考问答 时间:2024/04/29 15:24:37
#include <stdio.h>
main()
{ union
{ int i[2];
long k;
char c[4];
}r,*s=&r;
s->i[0]=0x39;
s->i[1]=0x38;
printf("%c\n",s->c[0]);
}
A) 39 B) 9 C) 38 D) 8
参考答案B,要求有详细分析过程。

intel的cpu是小端排列的,(不懂的话搜索一下大端小端内存规则bigend)
也就是说一个int型整数在内存中的排列是 低字节在前,高字节在后。
不行可以自己使用内存查看器来看。
注意我说的是intel的硬件,不同的硬件是不同的,也有的是采用大端规则

那为什么“s->c[0]取得是低字节的的数据”?,强制把这个int 型整数当作
char来看的话,一个int整数只能分成 4个char来处理了(长度不同,一个char占一个字节,int占4个字节),
因为c语言中数组的地址是从低向高排列的。所以s->c[0]取得是int类型的最开始的字节了,而由于小端规则,intel机器中int的低字节是排在前面的。
所以取的就是低字节了。

在我得机器上,

s->i[0]=0x39; 是这样保存的
39 00 00 00 接下来是 s->i[1]=0x38; 38 00 00 00

s->c[0]取的是第一个字节,s->c[0]=39(39 00 00 00 的第一个字节,)
如果里想深入了解这些问题的的话这本书不错《深入了解计算机系统》从外国翻译过来的