位移算子'<<&#创建Extra 0xffff?

时间:2017-03-31 00:09:12

标签: overflow bit-shift

我目前仍然遇到这种简单的位移问题。问题是当我为短变量分配任何值时,并使用<< 8,当我将结果保存到' short'时,我得到0xffff(2个额外字节)。变量。但是,对于' long',没关系。所以我想知道为什么会发生这种情况?

我的意思是,短片不应该读取超过2个字节但是......它清楚地表明我的短值包含额外的2个字节,值为0xffff。

我正在寻求你的智慧.. :)

This image describes the problem. Clearly, when the 'sign' bit(15) of 'short' is set to 1 AFTER the bit shift operation, the whole 2 byte ahead turns into 0xffff. This is demonstrated by showing 127(0x7f) passing the test but 0x81 NOT passing the test because when it is shifted, Due to it's upper 8. That causes to set Bit15(sign bit) to '1'. Also, Because 257(0x101) doesn't set the bit 15 after shifting, it turns out to be OK.

1 个答案:

答案 0 :(得分:0)

您的代码存在一些问题。

首先,您使用带符号变量进行位移操作,这可能会产生意外结果。使用unsigned short代替short进行位移,除非您确定自己在做什么。

您明确地将short转换为unsigned short,然后将结果存储回short类型的变量。不确定你期望在这里发生什么,这是毫无意义的,并且不会阻止任何事情。

问题与此有关。 129 << 833024,该值太大,无法放入已签名的short。您无意中点亮了符号位,导致数字变为负数。如果您将其打印为%d而不是%x,则会看到。

因为short作为参数传递给int时被隐式提升为printf(),所以您会看到此负数的32位版本,其中有16个最相关的位被点亮根据。这是前导ffff的来源。

long您没有遇到此问题,因为即使其已签名的long仍然足够大,可以存储33024而不会使符号位重载。