C语言求值问题——再次困惑

来源:百度知道 编辑:UC知道 时间:2024/06/16 03:12:34
#include<stdio.h>
union ss
{ int I;
char c[2];
};
void main()
{ union ss x;
x.c[0]=10;
x.c[1]=1;
printf("%d",x.i);
}

A,11 B,266 C,265 D,138

这道题有一些问题,我在VC6.0环境下运行,结果用十六进制输出是0xCCCC010A,说明题中只是将低位的两个字节赋值了,而高位的两个字节的值是不确定的.
在对x.c[0],x.c[1]赋值之前先对整块内存初始化一下就OK了,程序改为:
void main()
{
union ss
{
int i;
char c[2];
};
union ss x;
x.i = 0;//将此块内存初始化为0
x.c[0]=10;
x.c[1]=1;
printf("%x\n",x.i);

}

题目分析:因联合体中的数据共用一块内存,即int i的4个字节,c[0],c[1]分别在i的低位字节上,将c[0],c[1]赋值后就相当于将i的低位字节赋值,而i的高位2个字节被初始化成了0,故i = 0x0000010A;转换成10进制为266,选B.

选B

i = 0000 0001 0000 1010
c[1]=0000 0001 c[0]=0000 1010

B对

你就运行一下不就知道了

在不同的编译器下应该有不同的结果!在普通的TC下整型数是占2个字节而字符型变量是占1个字节!在union中两个char型变量正好占用了int型变量的地址。而在VC编译器中int类型占4个字节!所以不同的编译器运算的结果也应该是不同的。