小数到符号和大小的转换

Posted

技术标签:

【中文标题】小数到符号和大小的转换【英文标题】:Decimal to sign and magnitude conversion 【发布时间】:2014-01-10 16:41:41 【问题描述】:

我有一个我已经解决的问题和许多其他类似的问题,我已经成功地完成了我的任务。我对其中一个问题有点困惑......

“十进制数 -256 保存在 9 位内存位置。用符号和大小表示。”

我得到的答案是... 11 0000 0000

我是如何做到这一点的:

我们先显示二进制形式,然后将最高位取反(最左边的位。O代表正值,1代表负值)符号决定是正值还是负值以及大小是数字的总和或比特的总和等。

请注意,我添加了一个额外的位来显示 -256 的符号和幅度表示。这仅仅是因为 9 位不足以显示 256 是负数还是正数,因为它已达到最大值。总共 9 位给出的幅度为 256,第 10 位(最左边)显示符号为“1”,这表明它是负 256。

让我感到困惑的是,十进制 -256 保存在 9 位内存位置,我得到的结果是 1 0000 0000。我添加了一个额外的位来表明该数字是负数,然后将其表示为 10少量。我很难仅使用 9 位来表示 -256 的符号和幅度。似乎不可能以 9 位显示,因此我使用了 10 位,但我只能使用 9 位。有人可以帮助如何实现这一目标。对你的帮助表示感谢。我只是有点坚持这一点。我的导师希望我们使用互联网或自学知识,甚至不会给我们任何线索。所以这就是我在这里的原因。

【问题讨论】:

二进制补码有一个有趣的特点,即数字的范围总是从正 N 到负 (N+1)。也就是说,一个有符号字节将表示从 127 到 -128。在上面的示例中,-256 是 2 的补码形式的 9 位 1。 您正在查看的符号/幅度表示有时称为“一个补码”。它有一个有趣的特点,即有正零值和负零值。 (这就是丢失额外计数的地方。) (顺便说一句,你上面得到的11 0000 0000 答案是正确的。) 【参考方案1】:

知道这有点晚了,但我刚刚在我的硬件中也想知道这一点,然后查了一下。

给定 w 位,符号幅度的幅度为 2^(w-1)-1100000000 的十进制等效值为 256。 假设位数为92^(8)-1 = 255

因此,在给定9 位的符号大小的情况下,不可能存储256

【讨论】:

【参考方案2】:

不可能用 9 位以符号幅度表示 -256,因为不可能用 8 位表示 256,(8 位精度,提供 2^8 = 256 不同的可能值,因此您可以表示从 0255,但没有更多)。

【讨论】:

感谢您的帮助。我只知道这是不可能的,但我也知道有一个可能的答案是“没有可能的答案”,感谢您澄清这一点。 不正确。二进制补码的范围是 - 2^(n-1) 到 +2^(n-1)-1,它们是 2^n 个不同的值。 9 位给你 -256 到 +255。见en.wikipedia.org/wiki/Two's_complement @PeterWebb 我对二进制补码只字未提。我特别指出,您不能在 符号幅度 中表示 -256,因为额外的位不会改变绝对值的范围,在给定 8 位的情况下,绝对值的范围最多只能达到 255。请再次阅读我的回答并重新考虑您的否决票,我说的没有错,并且已经准确地回答了问题。 @asQuirreL - 很公平,这是另一个提到 2 的补码的答案,我只是错误地认为这是要使用的表示(因为这很常见并且提出了一个有趣的问题)。抱歉,我应该回复 taytay。我不能再对你投反对票了。也许有人想投票? @PeterWebb,不用担心,OP 的问题已经得到了回答:)

以上是关于小数到符号和大小的转换的主要内容,如果未能解决你的问题,请参考以下文章

c语言求一个float转换为字符串的函数,包括符号,小数

字符串格式说明

C#控制台基础 无符号二进制小数转换为十进制

C#控制台基础 无符号八进制小数转换为十进制

C#控制台基础 无符号十六进制小数转换为十进制

MATLAB里将十进制负小数转换成十六进制数