关于union

 先从两个例子讲起:

例一:

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;依此类推
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值