2013-05-25 56 views
-2

你能帮我吗?据我所知,0xA07F的十进制值是:16^3 * 10 + 0 + 16 * 7 + 1 * 16 = 41088。那我该如何转移呢?输出是2032
下面是代码:C++位操作 - 十六进制

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

'0xF'不是16。 – chris

回答

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

5

究其原因,输出小于值变小的是,你溢出类型的宽度。使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 

短期将晋升为一个无符号整数,换挡会做,但结果将trucated回16-因此您只能得到1010_0000_0111_1111_0000结果的0000_0111_1111_0000部分。

1

短只能容纳两个字节:从(http://www.cplusplus.com/doc/tutorial/variables/

短整型(短)短整型 。 2字节签署:-32768至32767 无符号:0〜65535

因此,您的代码溢出,这就是为什么移位opearator值减小。

尝试:

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

您正在启动与0xA07F,这是16位长,那么左移4位,这将导致在0xA07F0。您已宣布sh为短,因此截断A并导致0x07f0