我知道 -127 的二进制表示是 10000001(补码)。
任何人都可以告诉我为什么我将它右移一位,然后我得到 11000000 ?
(-127) = 10000001
(-127>>1) = 11000000 ???
谢谢。
我知道 -127 的二进制表示是 10000001(补码)。
任何人都可以告诉我为什么我将它右移一位,然后我得到 11000000 ?
(-127) = 10000001
(-127>>1) = 11000000 ???
谢谢。
在某些语言中,右移将填充最高有效位中的任何内容(在这种情况下1
)。这是为了使符号在移动负数时不会改变,如果不适当,它会变成正数。
如果您的编程语言进行符号扩展右移(如 Java 所做的那样),那么最左边的 1 来自扩展符号。也就是说,由于最高位设置为原始数字,因此每次移位的结果中都保持设置(因此移位超过 1 时,最高位中的所有 1 都对应于完成的移位次数)。
这取决于语言 - IIRC C 和 C++ 符号扩展为有符号值右移,而不是无符号值。Java 有一个特殊的 >>> 运算符可以在不扩展的情况下进行移位(在 Java 中,所有数字原始值都已签名,包括误导性命名的字节)。
-127 作为 WORD(2 个字节)是1111111110000001
. 如果您将其右移 1 位,并将其表示为单个字节,则结果11000000
可能是您所看到的。
它是符号扩展,因此右移的负数仍然是负数。