你能帮我吗?据我所知,0xA07F的十进制值是:16^3 * 10 + 0 + 16 * 7 + 1 * 16 = 41088。那我该如何转移呢?输出是2032
下面是代码:C++位操作 - 十六进制
unsigned short sh = 0xA07F;
sh = sh << 4;
cout << dec << sh << endl;
你能帮我吗?据我所知,0xA07F的十进制值是:16^3 * 10 + 0 + 16 * 7 + 1 * 16 = 41088。那我该如何转移呢?输出是2032
下面是代码:C++位操作 - 十六进制
unsigned short sh = 0xA07F;
sh = sh << 4;
cout << dec << sh << endl;
你基本上二进制文件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
究其原因,输出小于值变小的是,你溢出类型的宽度。使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
短期将晋升为一个无符号整数,换挡会做,但结果将trucated回16-因此您只能得到1010_0000_0111_1111_0000
结果的0000_0111_1111_0000
部分。
短只能容纳两个字节:从(http://www.cplusplus.com/doc/tutorial/variables/)
短整型(短)短整型 。 2字节签署:-32768至32767 无符号:0〜65535
因此,您的代码溢出,这就是为什么移位opearator值减小。
尝试:
unsigned int sh = 0xA07F;
sh = sh << 4;
cout << dec << sh << endl;
您正在启动与0xA07F
,这是16位长,那么左移4位,这将导致在0xA07F0
。您已宣布sh
为短,因此截断A并导致0x07f0
。
'0xF'不是16。 – chris