【问题标题】:Octal arithmetic. If the octal is signed, what do I do?八进制算术。如果八进制是有符号的,我该怎么办?
【发布时间】:2020-01-10 08:13:32
【问题描述】:

当这些值表示以符号大小格式存储的有符号 12 位八进制数时,4365 - 3412 是什么?结果应该用八进制写。展示你的作品。

所以二进制的 4365 是:100 011 110 101 而二进制的3412是:011 100 001 010

我从这里去哪里?既然是符号幅度,我是否将 4365 中的位反转为:011 100 001 010 然后从那里减去?

【问题讨论】:

  • 不,您不会反转任何位。但是前面的4 告诉你符号位已设置,所以4365 实际上代表-425 (dec)。
  • 我如何知道符号位已设置?八进制数的规则是什么?
  • 嗯,符号位通常是符号大小形式的最高有效位。它应该在某个地方正确记录 - 在任务中,在您的讲义中,等等。
  • @Bergi,以4365 给出的 12 位有符号八进制不是以十进制表示 (-1803) 吗?不确定(-425) 来自哪里。
  • @Wyck 4000 (0x800) 位是符号,其他位 0365 (0x0F5) 是幅度。

标签: computer-science octal


【解决方案1】:

问题要求4365 - 3412 的值以符号大小格式表示。所以:

  1. 将八进制 4365 转换为十进制。 (是否定的!)
  2. 将八进制 3412 转换为十进制
  3. 计算差异
  4. 将答案转换为 12 位有符号幅度(二进制)
  5. 翻译成八进制。

这是一种方法。另一种方法是计算八进制...或二进制...算术的差异。 (你的八进制/二进制算术技能有多好?)

【讨论】:

  • 你怎么知道4365是负数?
  • 查看@Bergi 的评论。
  • 我不会转换成十进制,至少在这个例子中不会——计算起来要复杂得多!您只需要去掉符号位,记住您是在添加两个负数,然后再次附加适当的符号位。
  • 我已经建议了很多方法来做到这一点。我的第一个建议是我认为会给 OP 最大的信心,即他得到了正确的答案。另外,你说的也不完全正确。您需要用八进制进行算术...这不是 OP 可能学到的技能。
  • 是的,没错 - 但是当仔细查看八进制或二进制表示时,会发现这里实际上不需要太多 算术 :-)
【解决方案2】:

4 个八进制数字代表 12 个二进制数字。

大概符号幅度意味着有1位表示符号和11位幅度。如果幅度为正则符号位为0,如果幅度为负则符号位为1。

12 位符号大小格式与无符号 12 位数字相比的解释如下:

      [  Sign ][ Magnitude ]
      [-------][-----------]
BITS  [    11 ][      0-10 ]

您的问题以 重新解释将符号幅度编码值的位作为4365 给出的无符号 12 位八进制数的位开始。 p>

我们可以通过查看二进制位来解码。 (真的,只是最重要的位。)我们看到符号是 1(它是负数),其余位是幅度。

      ENCODED OCT   4365
      ENCODED BIN  [100 011 110 101]
         SIGN BIN  [1
    MAGNITUDE BIN    00 011 110 101]
             SIGN  negative (-)
    MAGNITUDE OCT   365

实际上,通过查看第一个数字,可以轻松地从原始八进制表示中读取符号和大小。

  • 如果前导数字是 {0, 1, 2, 3},则为正数。
  • 如果前导数字是 {4, 5, 6, 7},则幅度为负。我们将数字的第一位重新映射为{0, 1, 2, 3},然后将结果视为幅度。 (或简单地从第一个数字中减去 4)

一些例子:

  • 4365 编码-0365,或简单地为-365
  • 5234 编码 -1234
  • 3210 编码 +3210
  • 0000 编码+0000,或简单地0
  • 4000 编码一个“负零”,它不会对算术产生不利影响,但应该被规范地视为数量为零 0

要对两个有符号数进行加法运算,只需跟踪它们的符号位即可。

  • 如果符号位相同,则只需添加幅度并保留符号位。
  • 如果符号位不同,则从较大的幅度中减去较小的幅度,并保留较大幅度的符号。

要对两个有符号数进行减法运算,只需翻转第二个数的符号,然后使用加法过程即可。


在您的示例中,我们注意到我们有一个负数减去一个正数,这意味着我们只需将幅度相加并得到一个负数。

幅度以简单的逐位方式相加,如下所示:

    3 6 5
+ 3 4 1 2
---------
  3 7 7 7   

根据规则,结果的符号将为负数。所以我们需要对第一个数字进行反向映射来设置第 11 位(符号位)。 {0, 1, 2, 3} 映射到 {4, 5, 6, 7}(或简单地将 4 添加到第一位)。所以 3 变成了 7,八进制的最终编码数字是:7777

【讨论】:

  • 如果我想先转换为二进制然后添加...有没有办法做到这一点?
  • 哦,我看到八进制的 365 = 十进制的 245
  • 将符号幅度转换为二进制补码:将最高有效位(符号位)设置为零,然后将所有位反转,然后加一。
猜你喜欢
  • 2013-11-02
  • 1970-01-01
  • 2018-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-25
  • 2016-02-14
  • 2010-12-22
相关资源
最近更新 更多