C语言题,求教

3.以下程序的输出结果是___________。
main()
{union{int count[2];
char ch[4];}un;
int i ;char letter=6;
for(i=0;i<4;i++)un.ch[i]=letter++;
for(i=0;i<2;i++)printf("%d: %x ,", i , un.count[i]);}
讲讲如何算的,本来会现在又忘了

这道题主要考察三个知识点,一个是共用体(也称为联合)的内存布局,一个是整型变量的大小,一个是字节序对整型的影响问题。
首先要明确,共用体的大小是由其最大成员的大小决定的,就你这个程序看如果是在16位的CPU上编译,因其整型占两个字节,所以sizeof un是4字节;如果在32位CPU上编译的话,因整型变量占4字节,所以sizeof un是8字节。
因为共用体是使用同一块内存的,所以对成员变量的赋值顺序会最终影响到对共用体的数据表示的解释,你的程序中第一个循环是给ch数组的成员分别赋整型值6、7、8、9,对于16位CPU实际上相当于给count[0]和count[1]都赋了值,而对于32位CPU只是给count[0]赋了值
这里先介绍下什么字节序

现代的计算机系统一般采用字节(Octet, 8 bit Byte)作为逻辑寻址单位。当物理单位的长度大于1个字节时,就要区分字节顺序(Byte Order, or Endianness)。常见的字节顺序有两种:Big Endian(High-byte first)和Little Endian(Low-byte first),这就是表1中的BE和LE。Intel X86平台采用Little-Endian,而PowerPC处理器则采用了Big-Endian。
大端Big-Endian

低地址存放最高有效位(MSB),既高位字节排放在内存的低地址端,低位字节排放在内存的高地址端。举例如下,内存中的数据存储有低地址向高地址排列如下 0x0A 0x0B 0x0C 0x0D,则在Big-Endian字节序下,装载到寄存器内表示为0x0A0B0C0D

计算机体系结构中一种描述多字节存储顺序的术语,在这种机制中最高有效位(MSB)存放在最低端的地址上。采用这种机制的处理器有IBM3700系列、PDP-10、Motorola微处理器系列和绝大多数的RISC处理器。

小端Little-Endian

低地址存放最低有效位(LSB),既低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。举例如下,内存中的数据存储有低地址向高地址排列如下 0x0A 0x0B 0x0C 0x0D,则在Little-Endian字节序下,装载到寄存器内表示为0x0D0C0B0A

计算机体系结构中一种描述多字节存储顺序的术语,在这种机制中最不重要字节(LSB)存放在最低端的地址上。采用这种机制的处理器有PDP-11、VAX、Intel系列微处理器和一些网络通信设备。该术语除了描述多字节存储顺序外还常常用来描述一个字节中各个比特的排放次序。

目前PC使用的CPU都是基于X86架构的处理器,这一系列的处理器在存储数据时采用的Little Endian的格式,所以对于16位CPU来说count[0]的内容是0x0908即10进制的152、count[1]的内容是0x0706即十进制的118;而对于32位CPU来说,count[0]的内容是0x09080706转换为十进制就是151521030,count[1]的内容因为未做初始化,是未知的。

如果使用的Power系列使用Big Endian的处理器那么结果对于16位CPU来说count[0]的内容是0x0607即10进制的103、count[1]的内容是0x0809即十进制的137;而对于32位CPU来说,count[0]的内容是0x06070809转换为十进制就是101124105,count[1]的内容因为未做初始化,是未知的。
所以回答这道题必须在明确的环境条件限制下才能有准确的答案,即必须明确CPU的位数和使用什么样的字节序,否则无法给出答案
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-12-12
count 的四个字节和 char 的四个字节是重复的。
char 四个字节的内容分别是:6,7,8,9
那么,count ,两个int的内容就是 6 × 256 +7 , 8 × 256 + 9(不愿意算了,自己算吧)追问

能详细一点吗?不太懂

追答

一个char是一个字节,一个int 是两个字节,union就是让所有成员重复使用一个地址位置。
即4个char和两个int是指的一个位置的四个字节。
按照4个char的排列,则为 6,7,8,9,按照两个int的排列就是0607;0809(十六进制,这样好表示)

追问

但是答案为什么不是7060而是706?

追答

老大,你确认你学过计算机基础?一个字节存数据,是怎么个存法。以06的字节为例:你存进去的是06,难道他会自己变成60???

追问

貌似懂了。

追答

Over

本回答被提问者采纳
第2个回答  2011-12-12
因为stdin里还有之前输入残留的换行和回车字符,直接scanf就读入换行符了。
先清一下stdin:

printf("Next game? y/n:");
fflush(stdin); //清一下stdin
scanf("%c",
相似回答