【发布时间】:2013-05-25 15:00:39
【问题描述】:
你能帮帮我吗?据我所知,0xA07F 的十进制值为:16^3*10 + 0 + 16*7 +1*16= 41088。那我该如何转换呢?输出为 2032。
代码如下:
unsigned short sh = 0xA07F;
sh = sh << 4;
cout << dec << sh << endl;
【问题讨论】:
-
0xF不是 16。
你能帮帮我吗?据我所知,0xA07F 的十进制值为:16^3*10 + 0 + 16*7 +1*16= 41088。那我该如何转换呢?输出为 2032。
代码如下:
unsigned short sh = 0xA07F;
sh = sh << 4;
cout << dec << sh << endl;
【问题讨论】:
0xF 不是 16。
您基本上拥有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,所以应该是2bytes,也就是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
short 将被提升为无符号整数,将完成移位,但结果将被压缩回 16 位 short,因此您只会得到 1010_0000_0111_1111_0000 结果的 0000_0111_1111_0000 部分。
【讨论】:
Short 只包含两个字节: 来自(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;
【讨论】:
您从 16 位长的 0xA07F 开始,然后左移 4 位,这将导致 0xA07F0。您已将 sh 声明为短,因此截断 A 并导致 0x07f0。
【讨论】: