位移位运算符“<<”创建额外的 0xffff?
Bit Shift Operator '<<' creates Extra 0xffff?
我目前被这个简单的移位问题困住了。问题是 当我为一个短变量分配任何值,并用 << 8 移动它们时,当我将结果保存到 'short' 变量时,我得到 0xffff(2 个额外字节)。 但是,对于 'long' 来说是可以的。所以我想知道为什么这会发生?
我的意思是,short 不应读取超过 2 个字节,但是...它清楚地表明我的 short 值包含额外的 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.
您的代码有几个问题。
首先,您对有符号变量进行位移运算,这可能会产生意想不到的结果。使用 unsigned short
而不是 short
进行位移,除非您确定自己在做什么。
您显式地将 short
转换为 unsigned short
,然后将结果存储回 short
类型的变量。不确定您希望在这里发生什么,这是毫无意义的,也不会阻止任何事情。
问题与此有关。 129 << 8
是 33024
,一个太大的值不适合带符号的 short
。您不小心点亮了符号位,导致数字变为负数。如果将其打印为 %d
而不是 %x
.
,您会看到
因为 short
在作为参数传递给 printf()
时被隐式提升为 int
,您会看到这个负数的 32 位版本,它有 16 个最相关的位按照点燃。这就是前导 ffff
的来源。
long
没有这个问题,因为即使它有符号 long
,它仍然足够大,可以存储 33024
而不会使符号位过载。
我目前被这个简单的移位问题困住了。问题是 当我为一个短变量分配任何值,并用 << 8 移动它们时,当我将结果保存到 'short' 变量时,我得到 0xffff(2 个额外字节)。 但是,对于 'long' 来说是可以的。所以我想知道为什么这会发生?
我的意思是,short 不应读取超过 2 个字节,但是...它清楚地表明我的 short 值包含额外的 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.
您的代码有几个问题。
首先,您对有符号变量进行位移运算,这可能会产生意想不到的结果。使用 unsigned short
而不是 short
进行位移,除非您确定自己在做什么。
您显式地将 short
转换为 unsigned short
,然后将结果存储回 short
类型的变量。不确定您希望在这里发生什么,这是毫无意义的,也不会阻止任何事情。
问题与此有关。 129 << 8
是 33024
,一个太大的值不适合带符号的 short
。您不小心点亮了符号位,导致数字变为负数。如果将其打印为 %d
而不是 %x
.
因为 short
在作为参数传递给 printf()
时被隐式提升为 int
,您会看到这个负数的 32 位版本,它有 16 个最相关的位按照点燃。这就是前导 ffff
的来源。
long
没有这个问题,因为即使它有符号 long
,它仍然足够大,可以存储 33024
而不会使符号位过载。