有个C语言题目,请大家帮帮忙,谢谢!!!!

来源:百度知道 编辑:UC知道 时间:2024/06/07 10:41:56
以下程序的输出结果是

#include<stdio.h>

main()

{union{int i[2];

long k;

char c[2];

} r, *s=&r;

s->k=0x12345678;

printf(“%x\n,s->c[0]);

}

A) 12

B) 78

C) 1234

D) 5678
请详细解说

0x12345678=0001 0010 0011 0100 0101 0110 0111 1000

按低位存储,八位一个字节,应该是B

耍人的

lz程序环境 TC下,
union
{ int i[2];
long k;
char c[2];
} r, *s=&r;
一个联合中的数据成员在内存中的存储是互相重叠的,每个数据成员都在相同的内存地址开始。它们共享同一块内存。union的长度为其内最长成员的长度,本题来说,在TC环境下是4个字节。
并且联合的存储是:
低地址存高位字节,高地址存低位地址。
0x12345678=0001 0010 0011 0100 0101 0110 0111 1000
八位一个字节,刚好4个字节。
按照存储原则,在读取这块内存的时候,s->c[0]指向的地址块的编码实际上是 0111 1000 所以输出 0x78;
假如输出s->c[1]指向的是 0101 0110 输出 0x56;
假如输出s->i[0]指向的是 0101 0110 0111 1000 输出5678;
假如输出s->i[1]指向的是 0001 0010 0011 0100 输出 1234;
环境是TC,如果在c++下面,鉴于现在的机器都是32位了,int变为了4个字节,所以此时这个union的长度变为了8个字节;



没答案

怎么考这种题啊!

在windoes下选B
其它的就可能不是这个答案了
主要是由机器存放字节的顺序来决定的