我目前仍然遇到这种简单的位移问题。问题是当我为短变量分配任何值时,并使用<< 8,当我将结果保存到' short'时,我得到0xffff(2个额外字节)。变量。但是,对于' long',没关系。所以我想知道为什么会发生这种情况?
我的意思是,短片不应该读取超过2个字节但是......它清楚地表明我的短值包含额外的2个字节,值为0xffff。
我正在寻求你的智慧.. :)
答案 0 :(得分:0)
您的代码存在一些问题。
首先,您使用带符号变量进行位移操作,这可能会产生意外结果。使用unsigned short
代替short
进行位移,除非您确定自己在做什么。
您明确地将short
转换为unsigned short
,然后将结果存储回short
类型的变量。不确定你期望在这里发生什么,这是毫无意义的,并且不会阻止任何事情。
问题与此有关。 129 << 8
为33024
,该值太大,无法放入已签名的short
。您无意中点亮了符号位,导致数字变为负数。如果您将其打印为%d
而不是%x
,则会看到。
因为short
作为参数传递给int
时被隐式提升为printf()
,所以您会看到此负数的32位版本,其中有16个最相关的位被点亮根据。这是前导ffff
的来源。
long
您没有遇到此问题,因为即使其已签名的long
仍然足够大,可以存储33024
而不会使符号位重载。