c++共同体分别取出一个整数的4个字节

输入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
希望能帮助你。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2015-01-15
把511转换成二进制
那么 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

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网