输入511, 输出结果为0 0 1 -1
为什么呢
看了你的追问,你问的问题和CPU的大小端有关系,建议你看一下介绍CPU大小端的相关文章。
你想要输出的结果应该是0 0 1 255对吧?
这个问题和CPU的大端小端有关系,这里您用的是PC机(小端),这里的解释针对小端的CPU
整数511对应的16进制表示为0x00 0x00 0x01 0xFF,所以a.c[0]中对应的是0xFF,a.c[1]中对应的是0x01,a.c[2]中对应的是0x00,a.c[3]中对应的是0x00。
但对于a.c[0]中对应的是0xFF,c[4]数组对应的类型是char,转换成整数是-1。所以输出0 0 1 -1
如果你把共同体中c[4]数组的类型改为unisgned char类型的话,就可输出0 0 1 255
附上源码如下:
#include <iostream>
using namespace std;
int main()
{
union
{
int i;
unsigned char c[4];
}a;
cin>>a.i;
for(int k =3;k>=0;k--)
{
cout<<(int)a.c[k]<<"\t";
}
}
追问
为什么0xFF转换为整数是-1
追答计算机存储的是数字的补码,对于一个字节,其值等于0xFF,如果用无符号整型来解析0xFF,那么解析出来的这个数是255,如果用有符号整型来解析,就是-1。
因为-1的原码是 1000 0001 反码是1111 1110,补码是1111 1111
希望能帮助你。
那么 0~7位是 c[0] 8~15位是c[1] 16~23位是c[2] 24~31是c[3]
自己算就知道了追问
转化位二进制是0000 0001 1111 1111
然后倒序输出,不应该是 1 -1 0 0 吗
1111 1111 明显是-1