为啥使用 MSB 作为符号位?

Posted

技术标签:

【中文标题】为啥使用 MSB 作为符号位?【英文标题】:Why is MSB used as the sign bit?为什么使用 MSB 作为符号位? 【发布时间】:2021-11-17 13:10:24 【问题描述】:

我在阅读 Kip Irvine 的关于 x86 汇编编程的书时,在解释有符号整数时提到,MSB(最高有效位)用作有符号位,0 表示 +ve,1 表示 -ve,如果我没有错。但是,我不明白为什么要使用 MSB 来表示符号。如果改用 LSB,恕我直言,更大的数字可能已存储在相同数量的位中。是不是因为 LSB,即第一位(第零位的位),是表示奇数所必需的?

【问题讨论】:

是哪位重要吗?问题是这个数字有 31 位,无论它们在哪里,这意味着 ve 如果改用 LSB,恕我直言,更大的数字可能会存储在相同的位数中 - 您是否放弃了存储奇数的能力,以释放 2^0 的位置值位置以用作符号/幅度表示的一部分? LSB 可用于符号位,但这通常是为了通过在所有正值之间“折叠”所有负值来允许对负值进行可变长度编码。但是,这不会增加最大可表示有符号数的绝对值,对于 8 位仍然是 128,对于 16 位仍然是 32768。不利的一面是,这种格式的算术会(很多)复杂。 【参考方案1】:

让 MSB 表示符号允许使用完全相同的硬件(晶体管)集执行无符号和有符号加法。

这与有符号整数对非负值使用与无符号相同的位模式有关,如果将符号位放在其他任何地方,情况就不会如此。这意味着像 C (unsigned)my_intvar 这样的操作是免费的,而不需要移位或旋转指令,或者一些特殊的转换指令。


AFAIK,这是符号位最合乎逻辑且最不令人惊讶的位置。实际上,如果想要一个 16 位有符号数来允许对值 65534 进行编码,则需要放弃奇数。

从数学角度来看,认为每个位具有不同的权重也更有意义:1,2,4, ..., 16384, 32768 用于无符号 16 位值,但 1,2,4, .. ., 16384, -32768 用于有符号值。这简化了硬件算法的分析,例如有符号和无符号乘法共享绝大多数逻辑。

【讨论】:

算法是硬件吗?我以为它们只是软件 主要面向硬件实现的算法是我的观点。当然,也可以使用相同的逻辑来模拟仅使用无符号乘法的有符号乘法,反之亦然。我会声称,硬件设计人员最需要分析。 我要补充一点,2-补码使它变得漂亮,因为它不管签名如何都可以工作。 完全正确:在 MSB 上只有一个符号位是不够的。此外,编码需要是二进制补码,这是符号位具有负权重 -pow(2,bits-1) 和所有其他位保留正权重的推论。

以上是关于为啥使用 MSB 作为符号位?的主要内容,如果未能解决你的问题,请参考以下文章

MSB与LSB的含义

MSB与LSB的含义

为啥不使用基于二进制补码的浮点数?

为啥逻辑左移与算术左移相同?

如何测试有符号或无符号整数的最高有效位?

为啥 PostgreSQL 不使用无符号整数作为 ID?那不会提供两倍的可能记录吗?