【问题标题】:Fractional Binary Subtraction Problem from CSAPP 3rd Practice Problem 2.51CSAPP 3rd 练习题 2.51 的分数二进制减法问题
【发布时间】:2021-07-05 19:08:04
【问题描述】:

0.00011001100110011001101 - 0.0000000000000000000000000[1100] 的二进制表示是什么?这两个数字都使用小数二进制数表示。

我教科书中给出的解是0.0000000000000000000000000[1100]。

我已经尝试过了

0.00011001100110011001101 - 0.000[1100]

按照二进制减法规则(1 - 0 = 1, 0 - 1 = 1, 1 - 1 = 0, 0 - 0 = 0),我得到的答案与给定的解决方案完全不同。这种减法的正确方法是什么?

注意:这个问题源自 CSAPP 3rd Practice Problem 2.51。

【问题讨论】:

  • 很抱歉。该网站声明 0 - 1 = 1,因为我们可以从当前数字左侧的潜在 1 借用,以便我们可以做 2 - 1 = 1。
  • 我担心你混淆了不同的东西。此外,“教科书”解决方案(正如您所引用的那样)看起来非常错误,结果肯定是否定的。
  • Charles Z. Post 被标记为 [floating-point]。 FP 没有像 0.000[1100] 这样的重复分数。
  • @CharlesZ。如果“所有数均使用小数二进制数表示”为真,则 0.1(以 2 为底)与 0.5(以 10 为底)相同。 0.1 只能使用非终止序列 0.000[1100] 矛盾来表示。仍然不清楚为什么 [floating-point] 标签因为那里没有重复的分数。
  • 如果这是 CS:APP 的“全球”版,请注意它的汇编语言练习问题被出版商雇用的不称职/粗心的人破坏了。例如CS:APP example uses idivq with two operands?。这个特定的问题可能好也可能不好 - 重写问题的人似乎对计算机体系结构有所了解,但据我所见,他们的 x86-64 细节存在很大差距。

标签: c binary


【解决方案1】:

0.00011001100110011001101 - 0.1 的二进制表示是什么?

由于第二个大于第一个,所以倒序

-(0.1 - 0.00011001100110011001101)

  0.10000000000000000000000 append zeroes
- 0.00011001100110011001101
---------------------------
  0.01100110011001100110011

结果-0.01100110011001100110011

【讨论】:

    【解决方案2】:

    我的看法,使用 1 的补码减法:

      0.00011001100110011001101 (a)
    − 0.10000000000000000000000 (b)
    

    变成:

         1111111111111111111111  (carry bits)
       0.00011001100110011001101 (copy of a)
     + 1.01111111111111111111111 (1's complement of b)
       =========================
       1.10011001100110011001100 (sum)
    

    然后对结果取1的补码,并加上一个负号:

     -0.01100110011001100110011
    

    除非他们执行某种不允许负值的特殊截断减法,否则我看不出有任何方法可以得到他们的解决方案。

    【讨论】:

    • 为什么是 1 的补码减法,而不是无符号二进制?因为重复到无穷大,而不是定点?
    • @PeterCordes,因为他链接的页面显示了使用 1 的补码的方法。
    • 哦,你的意思是byjus.com/maths/binary-subtraction,OP在cmets中提到的,与他们教科书中的问题分开。是的,如果结果有结转,则在最低有效位中添加结转,所以他们只是推迟~x + 1 = -x 身份中的+1,以防该步骤可以最终结果是否定的时候避免。
    • 所以它不是“1 的补码减法”有符号减法,它是 使用 1 的补码 -> 二进制加法作为实现普通二进制减法的方法。又名“二进制减法 使用 / 1的补码”,正如该链接所描述的那样。除了命名翻转所有位的过程之外,“1 的补码”也是有符号整数表示的名称,其中位模式上的过程否定表示的值。 (en.wikipedia.org/wiki/Ones%27_complement)。 1 的补码加/减 与普通加/减相同的二进制操作,因此 CPU 执行 2 的补码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-12
    相关资源
    最近更新 更多