【问题标题】:C++ Bit Operations - Hexadecimals [closed]C ++位操作-十六进制[关闭]
【发布时间】:2013-05-25 15:00:39
【问题描述】:

你能帮帮我吗?据我所知,0xA07F 的十进制值为:16^3*10 + 0 + 16*7 +1*16= 41088。那我该如何转换呢?输出为 2032。
代码如下:

 unsigned short sh = 0xA07F; 
 sh = sh << 4; 
 cout << dec << sh << endl;

【问题讨论】:

  • 0xF 不是 16。

标签: c++ hex


【解决方案1】:

您基本上拥有sh 的二进制文件,如下所示:

1010 0000 0111 1111
A      0    7    F

然后:

sh <<= 4

1010 0000 0111 1111 0000 //^^Note that you have three 0s before A if 32 bits

变成:

0xA07F0

但是,由于shunsigned short,所以应该是2bytes,也就是16位。你应该得到:

0x07F0

最左边的字节被截断,你应该得到十进制的15 *16 + 7 * 256 = 2032。你可以在这里看到一个活生生的例子:http://ideone.com/Fy4PJr

【讨论】:

    【解决方案2】:

    输出小于移位值的原因是您溢出了类型的宽度。将sh 设为无符号整数,您将获得正确的值。

     0xA07F == 1010_0000_0111_1111
    

    如果你把它右移 4 你得到

     1010_0000_0111_1111 << 4 == 1010_0000_0111_1111_0000
                                 ^^^^
                                 ^^^^
                                 ^^^^
                                 These bits overflow the width of the type 
    

    short 将被提升为无符号整数,将完成移位,但结果将被压缩回 16 位 short,因此您只会得到 1010_0000_0111_1111_0000 结果的 0000_0111_1111_0000 部分。

    【讨论】:

      【解决方案3】:

      Short 只包含两个字节: 来自(http://www.cplusplus.com/doc/tutorial/variables/)

      short int (short) 短整型。 2 字节签名:-32768 到 32767 无符号:0 到 65535

      因此,您的代码会溢出,这就是移位运算符减小值的原因。

      尝试:

       unsigned int sh = 0xA07F; 
       sh = sh << 4; 
       cout << dec << sh << endl;
      

      【讨论】:

        【解决方案4】:

        您从 16 位长的 0xA07F 开始,然后左移 4 位,这将导致 0xA07F0。您已将 sh 声明为短,因此截断 A 并导致 0x07f0

        【讨论】:

          猜你喜欢
          • 2016-01-27
          • 1970-01-01
          • 2012-06-13
          • 1970-01-01
          • 2013-08-21
          • 1970-01-01
          • 2010-09-16
          • 1970-01-01
          相关资源
          最近更新 更多