2013-05-25 54 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