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;
输出小于移位值的原因是您溢出了类型的宽度。做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
。
你基本上有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
但是,因为sh
is unsigned short
,它应该是 2bytes,也就是 16 位。你应该得到:
0x07F0
最左边的字节被截断,你应该得到15 *16 + 7 * 256 = 2032
十进制。你可以在这里看到一个活生生的例子:http: //ideone.com/Fy4PJr
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;
您从0xA07F
16 位长开始,然后左移 4 位,这将导致0xA07F0
. 您已声明sh
为短,因此截断 A 并导致0x07f0
.