以其他基数表示负数

Posted

技术标签:

【中文标题】以其他基数表示负数【英文标题】:Represent negative numbers in other bases 【发布时间】:2021-11-22 23:00:23 【问题描述】:

我如何表示非 10 基数的负数,例如 base 20。我知道如何使用二进制补码在二进制中执行此操作,但是在其他基础中二进制补码的等价物是什么

例如,以 20 为底,拒绝数 100 表示为 50。我将如何使这个50 签名?我需要将其转换为二进制,二进制补码,然后将其转换回base-20吗?好像有点啰嗦。

在这种情况下,负基数 20 50(即基数 10 中的 100) 将是 7g,而 正数 将只是 @987654327 @。但这是在其他基数中表示负数的标准方式吗?

【问题讨论】:

加减号。 @גלעדברקן 这就像二进制中的 符号和幅度。这里是why sign and magnitude is a bad method。 我是在开玩笑,但现在从 trincot 的回答中学到了一些新东西! 也就是说,如果您在计算机上实现它,我看不出基数补码有什么帮助。大多数计算机只在内部对二进制数执行操作,而一个人可能编写的程序需要将另一个基数转换为计算机可以操作的表示,这意味着减号可能也可以工作。 【参考方案1】:

二进制补码的推广是radix complement。

根据定义,基数?中的?数字y的基数补码是??−?。基数补码最容易通过在减少的基数补码上加 1 得到,即 (??−1)−?

然而,我们必须同意 ? 是什么。例如,在二进制中,我们可以说我们有 32 位,所以在这种情况下 ? = 32。

所以对于base-20的例子我们应该做一些定义:

数字是“0123456789???????ℎ??”。 ? 是 10(任意选择,但必须做出)

我们还可以定义每个数字的“(减少的)互补数字”是什么。当添加到第一个数字时,它总是会产生最大的数字(在这种情况下是?20)。例如 220 + ℎ20 = ?20 sub>,所以ℎ20是220的补码,反之亦然。

对于您的示例编号 5020,我们进行如下操作:

用它的补码替换 ?-digit 表示的每个数字:

所以 000000005020 的减补因此变成??????????20

要得到 5020 的否定,我们只需要在其上加 1:

−5020 = ?????????020

重要的是不要减少这种表示以使用更少的数字——我们必须坚持使用?数字表示,否则不清楚数字是正数还是负数。

【讨论】:

非常感谢。因此,如果我理解正确,-50₂₀ 将像这样进行:正数:000050,补数:jjjjej,加一:jjjjf0,因此 -50₂₀ = jf0₂₀ 标准化时。如果我错了,请纠正我。 是的,你是对的。在我的回答中,我将示例从 50₂₀ 切换到 20₂₀,然后继续。它现在已更新以计算出 50₂₀ 的示例。但是,从您可以删除数字的意义上说,没有规范化。您需要遵守约定的位数。在二进制 8 中,数字 0b11111111 是 -1,但我们不能将其简化为 0b1,因为它只是 1。第一个数字(右数第 8 个)表示符号。 啊,是的,有道理,谢谢。 但是,如果我使用浮点表示法来表示这个数字,那么jjjjjjf0 将变为jf000000 0002,其中第一部分是 8 位尾数,第二部分是 4 位指数? 这取决于浮点的确切编码规则。最常见的二进制浮点表示法不将尾数编码为二进制分量,而是以绝对值编码,并具有单独的符号位。

以上是关于以其他基数表示负数的主要内容,如果未能解决你的问题,请参考以下文章

为啥java在改变基数之前将数字转换为负数

2019—2020 20191204 《信息安全专业导论》第三周学习总结

数在计算机中的表示

《信息安全专业导论》第三周学习总结

让基数/计数排序与负数一起工作

对 6 位非负数数组进行基数排序