0

我知道 -127 的二进制表示是 10000001(补码)。

任何人都可以告诉我为什么我将它右移一位,然后我得到 11000000 ?

(-127) = 10000001

(-127>>1) = 11000000 ???

谢谢。

4

5 回答 5

3

在某些语言中,右移将填充最高有效位中的任何内容(在这种情况下1)。这是为了使符号在移动负数时不会改变,如果不适当,它会变成正数。

于 2012-06-25T21:17:43.850 回答
3

如果您的编程语言进行符号扩展右移(如 Java 所做的那样),那么最左边的 1 来自扩展符号。也就是说,由于最高位设置为原始数字,因此每次移位的结果中都保持设置(因此移位超过 1 时,最高位中的所有 1 都对应于完成的移位次数)。

这取决于语言 - IIRC C 和 C++ 符号扩展为有符号值右移,而不是无符号值。Java 有一个特殊的 >>> 运算符可以在不扩展的情况下进行移位(在 Java 中,所有数字原始值都已签名,包括误导性命名的字节)。

于 2012-06-25T21:19:45.943 回答
2

-127 作为 WORD(2 个字节)是1111111110000001. 如果您将其右移 1 位,并将其表示为单个字节,则结果11000000 可能是您所看到的。

于 2012-06-25T21:17:47.813 回答
2

因为,如果你将 -127(二进制补码编码为10000001)除以 2 并向下舍入(朝向 -无穷大,而不是零),你会得到 -64(二进制补码编码为11000000)。

就位而言,原因是:当右移有符号值时,您会进行符号扩展——而不是移入零,而是复制最高有效位。当使用二进制补码有符号数字时,这可以确保正确的结果,如上所述。

汇编语言(以及它们编码的机器语言)通常具有单独的无符号和有符号右移操作指令(也称为“逻辑右移”与“算术右移”);编译语言通常在分别移动无符号和有符号值时选择适当的指令。

于 2012-06-25T21:20:43.163 回答
1

它是符号扩展,因此右移的负数仍然是负数。

于 2012-06-25T21:20:22.350 回答