有符号整数 - 最左边的符号位的优点

时间:2014-03-20 22:12:17

标签: compiler-construction integer sign signed

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

我试着到处寻找,但无法找到我的问题的答案。

将最左边的位置为符号位而不是最右边的位置还是任何其他位置是否有任何优势? 或者它本质上是一回事?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

正如我上面提到的,使用符号位会遇到与1的赞美相同的正/负0问题,并且它需要在硬件逻辑中使用更大的特殊情况集来使用此存储方法既困惑(在0的情况下)又昂贵(在时间和物理硬件逻辑方面)用于存储带符号的数字。

所有这一切,仍然存在“为什么最左边的位?”的问题。最终,这对哲学家来说是个问题。最终,在硬件级别上使用最重要的位没有明显的优势。管理数字所需的任何硬件逻辑都不会因位的位置而复杂化。就硬件而言,位可能位于中间位置。实际上,硬件电路实际上可以在物理上布局,中间是最重要的位,但逻辑上它位于左侧。但问问自己,这有意义吗?在美国,我们通常写下负数 a la -244521,左侧是负号。那么为什么不把标志位放在左边?

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

除了哲学之外,如this answer所述,将符号位放在最左边的位确实提供了有符号和无符号的数字之间的自然对齐,这对于我们缓慢的人脑通常是一件好事。

答案 1 :(得分:1)

优点是对于signed int和unsigned int,位/值的对齐保持不变。

带有值10的带符号的int等于unsigned int值10.由于相同的对齐。 如果你将符号位置于右侧,那么这些值将是不同的。