【问题标题】:why the binary representationof -127>>1 is 11000000?为什么-127>>1的二进制表示是11000000?
【发布时间】:2012-06-25 21:14:48
【问题描述】:

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

谁能告诉我为什么我将它右移 1 位,然后我得到 11000000 ?

(-127) = 10000001

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

谢谢。

【问题讨论】:

  • 思考:“符号填充移位”

标签: java algorithm computer-science


【解决方案1】:

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

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

【讨论】:

  • C 和 C++ do 在移动 signed int 时进行符号扩展。这使得 C/C++ char 的默认符号 unspecified 有点烦人......
  • 谢谢。这是有道理的。我用Java编码,值的类型是BYTE。
  • @AlKepp 否。在 java 中,BYTE 已签名。因此,范围是-128~127。检查这个:link
  • @comingstorm:实际上 C/C++ 是在右移有符号值时定义的实现,因此不同的编译器可能会做不同的事情。更糟糕的是,当左移负符号值时,它们是 UNDEFINED。
【解决方案2】:

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

【讨论】:

  • 不是“根据定义”;这取决于编程语言,并且可能取决于被移位的值是有符号还是无符号。
  • 僧侣,好的,我已经将我的答案编辑为一个更温和的版本。
  • @EmilVikström:如果它说为什么,我会更高兴这个答案
  • 谢谢。这是有道理的。我用Java编码,值的类型是BYTE。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    因为,如果您将 -127(编码为 10000001)的 -127(two's-complement)除以 2 并向下舍入(朝向 -infinity,而不是朝向零),您会得到 -64(编码为 11000000 的二进制补码)。

    按位,原因是:当右移有符号值时,您执行sign-extension - 而不是移入零,而是复制最高有效位。当使用二进制补码有符号数时,这可以确保得到正确的结果,如上所述。

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

    【讨论】:

    • 谢谢。这是有道理的。我用Java编码,值的类型是BYTE。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 2018-01-04
      • 2012-04-26
      • 2020-08-02
      • 2017-04-04
      • 1970-01-01
      • 2023-04-03
      • 2011-01-29
      • 2011-10-14
      • 2011-03-09
      相关资源
      最近更新 更多