aaronhexin,有些地方提醒了对,不胜感激。
以下是题目详细分析步骤(有错的地方希望能指正):
共用体变量s所占的内存长度等于最长成员的长度,题目有三个成员:整形数组a[2]共占用内存4个字节;长整型b变量也占4个字节;字符数组c[4]也占4个字节。因此s占的内存长度为4字节。
共用体本身及共用体的各成员起始地址均是相同的。
aaronhexin指出字节存储顺序是按大小端来的,本人自己TC2是小端的,其它版本可能不一样吧。
存储过程如下:
s.a[0]=0x39,是16进制,十进制数就是57,二进制数就是:0000 0000 0011 1001
s.a[1]=0x38,是16进制,十进制数就是56,二进制数就是:0000 0000 0011 1000
当程序执行到这二条赋值语句结束时,本人TC是小端,因此存储结构顺序如下:
printf(“%ld\n”,s.b);当执行这条语句时 b为 0000 0000 0011 1000 0000 0000 0011 1001,转化成十进制数正好是3670073。
printf(“%c\n”,s.c[0]);c[0]为 0011 1001,十进制数正好是57,输出的是字符,因此是'9'(9的ASCII码为57)。
为了说明上面说的正确性。
把原先题目的程序稍微改动一下:
#include <stdio.h>main(){
union {int a[2];
long b;
char c[4];}s;
s.a[0]=-12;
/* 原先s.a[0]=57改为-12;*/
s.a[1]=0x38;printf(“%ld\n”,s.b);printf(“%c\n”,s.c[0]);}按照上面方法得出存储结构顺序如下:
负数的补码是正数补码按位取反加1,因此-12的补码:1111 1111 1111 0100;
输出结果:s.b=3670073;s.c[0]=ASCII码等于244的字符(不好打)。
Why?
b:0000 0000 0011 1000 1111 1111 1111 0100
对应的十进制数为3735540;
S.c[0]=-12,输出的格式是字符因此是ASCII码等于244的字符.
尝试把s.c[1]以%d输出为-1;