-2

Could you please help me? As far as i know the decimal value of 0xA07F is: 16^3*10 + 0 + 16*7 +1*16= 41088. Then how do I shift this? The output is 2032.
Here is the code:

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

4 回答 4

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 

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

于 2013-05-25T15:04:50.930 回答
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

但是,因为shis unsigned short,它应该是 2bytes,也就是 16 位。你应该得到:

0x07F0

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

于 2013-05-25T15:05:30.547 回答
1

Short 仅包含两个字节: from( 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;
于 2013-05-25T15:07:07.107 回答
1

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

于 2013-05-25T17:27:31.733 回答