关于c++共用体的小代码~~

来源:百度知道 编辑:UC知道 时间:2024/05/29 20:33:32
#include <iostream.h>

void main()
{
union
{
int i;
char c[4];
}a;
cout<<"请输入一个整数:";
cin>>a.i;
cout<<"整数的四个字节的数分别为:";
for(int k=3;k>=0;k--)
cout<<(int)a.c[k]<<'\t';
cout<<endl;
}

比如输入1234,结果为0 0 4 -46
为什么啊??

int WIN32下32位,char c[4]也是32位,它们共用一块内存,当cin>>a.i时,char c[4]的内容也改变了,a.i=1234=00000000 00000000 00000100 11010010,
因为在内存中存储的是补码,同时高位低地址,低位高地址;所以实际上在内存中实际是01001011 00100000 00000000 00000000,所以c数组在内存中c[0]对应01001011,c[1]->00100000,c[2]->00000000,c[3]->00000000。
由于高位低地址,所以实际c[0]=11010010,c[1]=00000100,c[2]=00000000,c[3]=00000000。这些值是补码,由于c[0]补码第一位为1,即c[0]原码为负值,把c[0]补码减1取反即得原码:减1得,11010001,按位取反(第一位符号位不取反,1表示负),10101110.这样c[0]的原码为10101110,化成十进制就是-46;而c[0]的补码为正值,正值的补码就是原码,所以c[1]=00000100,即4;而c[2]、c[3]的补码为0,只有0的补码才是0,所以c[2]=c[3]=0;
数字比较乱,不知道楼主听明白没有

1234=256*4+221
所以第三位为4,第四位的221最高为为1,显示为负数,即-46