C ++位操作 - 十六进制

时间:2013-05-25 15:00:40

标签: c++ hex

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

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

4 个答案:

答案 0 :(得分:5)

输出小于移位值的原因是您溢出了该类型的宽度。将sh设为unsigned int,您将获得正确的值。

 0xA07F == 1010_0000_0111_1111

如果你右移4,你就得到了

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

短路将被提升为无符号整数,移位将完成,但结果将被重新分成16位短路,因此您只能得到0000_0111_1111_0000的{​​{1}}部分结果。

答案 1 :(得分:5)

您基本上拥有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,因此它应为2字节,即16位。你应该得到:

0x07F0

最左边的字节被截断,你应该得到十进制的15 *16 + 7 * 256 = 2032。您可以在此处查看实时示例:http://ideone.com/Fy4PJr

答案 2 :(得分:1)

Short只保存两个字节: 从(http://www.cplusplus.com/doc/tutorial/variables/

  

short int(short)Short Integer。签署了2字节:-32768到32767   unsigned:0到65535

因此,您的代码溢出,这就是移位操作符降低值的原因。

尝试:

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

答案 3 :(得分:1)

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