【问题标题】:Signed Integer - Advantage of Sign bit at leftmost bit有符号整数 - 符号位在最左边的优势
【发布时间】:2014-03-20 22:12:17
【问题描述】:

我知道,对于有符号整数,有一个符号位通常位于最左边的位,该位有 0 或 1 来显示整数是负数还是正数。

我尝试到处寻找,但找不到我的问题的答案。

与最右边或任何其他位相比,将最左边的位作为符号位有什么好处吗? 还是本质上是一样的?

【问题讨论】:

  • 当在一个补码中工作时,我猜不是,但在二进制补码中,“符号”位的位置是有意义的
  • 阅读2's complement

标签: compiler-construction integer sign signed


【解决方案1】:

注意,大多数计算机整数本身实际上并不使用符号位,而是使用所谓的2's complement 以带符号的方式存储数字。确实如此,但是当数字为负数时,2​​ 的补码会导致“最左边”,或者更具体地说,“最重要”位设置为 1

长话短说,通过使用 2 的补码方法对整数值进行编码,处理器上的数学处理单元可以使用一些很酷的技巧来加速加法和减法运算的处理。例如,可以使用与标准加法相同的硬件逻辑将负的 2 的补数添加到正的 2 的补数中,而符号位不允许这样做。

另一个表示有符号整数的系统,但不经常使用(需要引用)是1's compliment。直接理解 1 的恭维中的数字(对我们人类而言)更简单,因为要在 1 的恭维中存储负数,您只需翻转所有位。请注意,从技术上讲,仍然没有符号位,即使当数字为负数时最高有效位始终为 1,或者当数字为非负数时,最高有效位始终为 1(除了下面解释的情况)。与仅使用直接符号位相比,这里的优势再次简化了对数字进行算术运算的硬件逻辑。

1 的恭维确实遇到了使用符号位的数字所遇到的问题之一,那就是它可以以两种方式存储数字0。对于 8 位示例,补码中的 0 可以存储为 1111 11110000 0000。从本质上讲,这意味着您可以将0 存储为正负值,任何数学家都会告诉您这是没有意义的。本质上,0 没有正负号。它只是0。计算机科学家会看着数学家说“那又怎样”,那是因为这只是意味着我们需要在逻辑中处理一种特殊情况,以便以两种方式存储0。幸运的是,0 是唯一有此问题的数字,但我们真的希望始终检查我们的结果是否是两个可能的答案之一吗?即使这是在硬件级别完成并且对程序员隐藏(这会减慢计算速度,即使只是轻微的)?

正如我上面提到的,使用符号位会遇到与 1 的恭维相同的正/负0 问题,并且它需要硬件逻辑中的一组更大的特殊情况,使得使用这种存储方法用于存储带符号的数字令人困惑(在 0 的情况下)和昂贵的(在时间和物理硬件逻辑方面)。

说了这么多,还有一个问题是“为什么是最左边的位?”归根结底,这是哲学家的问题。最终,在硬件级别上使用最高有效位没有明显优势。管理数字所需的任何硬件逻辑都不会因位的位置而变得复杂。就硬件而言,该位可能位于中间。事实上,硬件电路实际上可以物理布局,最高有效位在中间,但逻辑上它在左边。但是问问自己,这有意义吗?在美国,我们通常写负数 a la -244521,负号在左边。那么为什么不把符号位放在左边呢?

事实上,在讨论如何在内存中存储大于 8 位的数字时,这种争论存在于更高的层面。您可以找到无数关于数字Endianness 的讨论,以及哪个更好。最后,这仅取决于您要完成的工作,但这超出了您的问题范围。

撇开哲学不谈,正如 this answer 中所述,将符号位放在最左边确实可以在有符号和无符号数字之间提供自然对齐,这通常对我们缓慢的人类大脑来说是件好事。

【讨论】:

    【解决方案2】:

    优点是对于有符号整数和无符号整数,位/值的对齐方式保持不变。

    值为 10 的有符号整数等于无符号整数值 10。因为对齐方式相同。 如果您将符号位放在右侧,则这些值会有所不同。

    【讨论】:

      猜你喜欢
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多