unsigned short sh = 0xA07F;
sh = sh << 4;
cout << dec << sh << endl;
答案 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
但是,由于sh
为unsigned 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
。