C++位操作 - 十六进制

use*_*162 -2 c++ hex

请你帮助我好吗?据我所知,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)

Jim*_*mbo 5

输出小于移位值的原因是您溢出了类型的宽度.创建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.


tao*_*ocp 5

你基本上有二进制文件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