请你帮助我好吗?据我所知,0xA07F的十进制值为:16 ^ 3*10 + 0 + 16*7 + 1*16 = 41088.那我该如何改变呢?输出是2032.
这是代码:
unsigned short sh = 0xA07F;
sh = sh << 4;
cout << dec << sh << endl;
Run Code Online (Sandbox Code Playgroud)
输出小于移位值的原因是您溢出了类型的宽度.创建sh一个unsigned int,您将获得正确的值.
0xA07F == 1010_0000_0111_1111
Run Code Online (Sandbox Code Playgroud)
如果你把它改为4你得到
1010_0000_0111_1111 << 4 == 1010_0000_0111_1111_0000
^^^^
^^^^
^^^^
These bits overflow the width of the type
Run Code Online (Sandbox Code Playgroud)
短路将被提升为无符号整数,移位将完成,但结果将被分解为16位短路,因此您只能得到结果的0000_0111_1111_0000一部分1010_0000_0111_1111_0000.
你基本上有二进制文件sh如下:
1010 0000 0111 1111
A 0 7 F
Run Code Online (Sandbox Code Playgroud)
然后:
sh <<= 4
1010 0000 0111 1111 0000 //^^Note that you have three 0s before A if 32 bits
Run Code Online (Sandbox Code Playgroud)
它成为了:
0xA07F0
Run Code Online (Sandbox Code Playgroud)
然而,由于shIS unsigned short,它应该是2字节,也就是16位.你应该得到:
0x07F0
Run Code Online (Sandbox Code Playgroud)
最左边的字节被截断,你应该得到15 *16 + 7 * 256 = 2032十进制.您可以在此处查看实时示例:http://ideone.com/Fy4PJr