分析c语言程序---结构体程序

来源:百度知道 编辑:UC知道 时间:2024/05/09 15:39:05
union data
{
int a[2];
int b;
float c;
char d[4];
} k;
main( )
{
k.a[0]=10000; k.a[1]=15000;
printf("k.a[0]=%d,k.a[1]=%d,k.b=%d,k.c=%f,k.d[0]=%c,k.d[1]=%c,k.d[2]=%c,k.d[3]=%c\n",k.a[0],k.a[1],k.b,k.c,k.d[0],k.d[1],k.d[2],k.d[3]);
scanf ("%s",k.d);
printf("k.a[0]=%d,k.a[1]=%d,k.b=%d,k.c=%f,k.d[0]=%c,k.d[1]=%c,k.d[2]=%c,k.d[3]=%c\n",k.a[0],k.a[1],k.b, k.c,k.d[0],k.d[1],k.d[2],k.d[3]);
}
设输入值为“abcd”,分析运行结果。
结果是k.a[0]=10000,k.a[1]=15000,k.b=10000,k.c=0.001161,………………输入abcd结果是k.a[0]=25185,k.a[1]=25699,k.b=25185,k.c=16777999408082104400000.000000,k.d[0]=%c,k.d[1]=a,k.d[2]=b,k.d[3]=c,k.d[3]=d

问题:k.c的值是怎么得来的,希望指点一下
方便大家10000==10 0111 0001 0000
15000==11 1010 1001 1000
非常感谢你们的回答;
内存结构为:
[01100100] [01100011] [01100010] [01100001]
这个清楚,就是怎么得来16777999408082104400000.000000的,
我自己算的和程序运行的结果不一样!
[0011 1010] [10011000] [001001

union是用来定义联合体的关键字,union维护足够的空间来置放多个资料成员中的最大的“一种”,而不是为每一个资料成员配置空间,在union中所有的资料成员共用一个空间,同时间只能储存其中一个成员的资料。
可以得出该共用体在内存中占用4个字节。

k.a[0]=10000; k.a[1]=15000; 为k的int a[2]成员赋值,即该内存的内容是[00111010] [10011000] [00100111] [00010000]将这4个字节换算成符点数就是0.001161.

scanf ("%s",k.d); //k.d[]="abcd"
因为scanf把4个输入压栈后再出栈对4个字符变量赋制值,则内存结构为:
[01100100] [01100011] [01100010] [01100001]
d[3] d[2] d[1] d[0]
c(4个字节)
b(前两个字节)
a[1](前两个字节) a[0](后两个字节)
将这4个字节换算成符点数c就是:16777999408082104400000.000000.

至于上面的数字是怎么得来的,那要考虑浮点数在计算机中的储存结构问题了.在存储1个浮点数的32位内存中,
第一位是符号位,下来的8位是指数位,后面的23位是尾数位.
[01100100] [01100011] [01100010] [01100001]
换算成浮点数的算法是:
第一位为0:正数
下来的8位是:[11001000],减去[01111111]为[1001001].所以指数为73
再下来的23位是1100011[01100010] [01100001].所以尾数为
(1.11000110110001001100001)B = 2^0+2^(-1)+2^(-1)+2^(-6)+2^(-7)+2^(-9)+2^(-10)+2^(-14)+2^(-17)+2^(-1