先从两个例子讲起:
例一:
union
u
{
int
i;
char
x[2];
}a;
int
main()
{
a.x[0] =
'1'
;
a.x[1] =
'2'
;
printf
(
"%d\n"
, a.i);
return
0;
}
结果打印出一个地址:-859045375;若把union中的i换为short,打印结果为513,因为此时union的两个字节存储分别为2和1,二进制表示为:0000 0010 0000 0001;计算机中都是用补码表示的;上述二进制是正数,补码即为原码513,因此结果为513,但是对于int而言,需要四个字节表示;而union只有两个字节,因此打印结果为随机地址
例二:
union test
{
char a[4];
short b;
};
int main()
{
union test test;
test.a[0]=256;
test.a[1]=255;
test.a[2]=254;
test.a[3]=253;
printf("%d\n",test.b);
getchar();
}
结果为-256,因为打印test.b时,union地址内存放的是256和0(256溢出表示为0),二进制表示为:1111 1111 0000 0000,其补码表示为:1000 0001 0000 0000即为-256.要考虑到内存的分布问题。
对于范围溢出注释:char a=257时,打印结果为1;依此类推