有关C语言联合体

来源:百度知道 编辑:UC知道 时间:2024/05/14 01:01:22
#include<stdio.h>
union un
{ int i;
char c[2]; };
void main( )
{ union un x;
x.c[0]=10;
x.c[1]=1;
printf("\n%d",x.i);}

为何运行结果是266,请帮忙解释下运算过程.
这个程序在TCwin里是可以运行的.

#include<stdio.h>
union un
{
int i;
char c[2];
};

void main( )
{
union un x;

x.i=0;
x.c[0]=10;
x.c[1]=1;
printf("%d\n",x.i);
}

运行结果:266

266的16进制是:0x010A
x.c[0]=10; 的16进制是0x0A
x.c[1]=1;的16进制是0x01

楼主,应该看出来它们的关系了吧?
__________________
|__x.c[0]__|__x.c[1]__|

如上图,按char排放
当按int排放的时候,
x.c[1]是低字节,x.c[0]是高字节

int :xx xx (16位机器中,int是16bit)
char:xx xx

int :xx xx xx xx(32位机器中,int是32bit)
char:xx xx

dos和windows下整型的内存形式是低位在前的
char:0A 01
int :0A 01 -->0x010a-->266

把c[1]和c[0]所在内存看成是存储int型的,因此输出i时,从高位开始读取数据,即c[1]当作i的高八位,c[0]当作i的低八位,所以输出结果就是1(c[1]的值)左移8位加上10(c[0]的值)=256+10=266