二进制补码减法

3
我需要帮忙使用二进制的2的补码来进行减法运算,并且在每个数字中使用5个位:

1) -9 -7 = ? 是否有溢出?
-9 = 01001(二进制的2's补码为10111),-7 = 00111(二进制的2's补码为11001)
现在我们需要相加,因为我们使用了2的补码
10111
+11001
= 100000,但这个答案没有意义。此外,由于答案超过了5位,我假设存在溢出。

2) 6 - 10,与之前的过程相同。负二进制数对我来说没有意义。

2
这个问题技术上并不是一个编程问题。 - m0skit0
预期的答案是什么?它在二进制补码中如何表示?它是否适合所提供的数字? - dmckee --- ex-moderator kitten
2
使用8位比5位更好,以避免混淆。这种方法肯定会有所帮助。-9(二进制):0000 1001-9(2的补码):1111 0111-7(二进制):0000 0111-7(2的补码):1111 1001。现在将它们相加: 1111 0111 +1111 1001 将产生一个进位1和输出1111 0000。在1111 0000的最左边,表示输出为负数(即“-”)。 因此,现在取输出的补码并加上1。那就是你的二进制答案。 你的问题可以理解为:“(-9)-(+7)”。因此,您不必浪费时间来推导出-7的二进制补码。 - phougatv
3个回答

7

1) -9 - 7

计算-9 - 7时,可以变形为-9 + (-7)

将-9和-7转换为2进制数:

9(二进制)= 01001
-9(2的补码)= 10111
7(二进制)= 00111
-7(2的补码)= 11001

 10111 +
 11001 =
110000

这个数无法装入5位。去除溢出后得到10000,即为-16(二进制)。

2) 6 - 10

6 - 10 = 6 + (-10)

6(二进制)= 00110
10(二进制)= 01010
-10(2的补码)= 10110

 00110 +
 10110 =
 11100

这可以用5个比特表示,且为-4(二进制)。


我了解计算机通过二进制补码存储负数。我想知道如果 6 - a, where a == -10,那么 -(-10) 的过程是如何进行的?它会尝试获取-10(10110)的二进制补码吗? - Weishi Z
@WeishiZeng 我不知道真正的处理器是如何做到的。我喜欢将 x - y 转换为 x + -y,因为这样我就不需要记住一个单独的算法来减去二进制数。如果你有 00110 - 10110,那么它变成了 00110 + -1011000110 + 0101010000,即-16。所以,是的,我只需通过翻转所有位并加上 1 来取 10110 的二进制补码。 - melpomene

0

10111 + 11001 不是 100000 而是 110000。

   1111
   10111
 + 11001
   -----
  110000

0

第一个问题的答案是错误的。要使用二进制补码找到-9-7,我们需要按照以下步骤进行:

步骤1:第一个数字的转换
1. 9的二进制转换:01001
2. 找到二进制的补码:10110
3. 将二进制补码加1:10110 +1 ----- 10111 步骤2:第二个数字的转换
1. 7的二进制转换:00111
2. 找到二进制的补码:11000
3. 将二进制补码加1:11000 +1 ------- 11001 步骤3:相加
现在将两个输出相加-9 +(-7):10111 +11001 -------- 110000 最重要的是检查答案是否正确。 您可以使用二进制位的索引:7 6 5 4 3 2 1 0 1 1 0 0 0 0
找到每个具有1位数字的指数的2的幂。 (-)2^5 + 2^4

*注意:在二进制补码中,最高位(索引最高的位)是符号位,因此使用“-”表示。 -2^5 + 2^4 = -32 + 16 = -16,这是-9-7=-16的正确答案。因此,二进制补码成为表示负数的流行方式。对于符号大小,我们需要假设一个符号位,这在计算机中很难实现,而对于1的补码,我们需要加1才能找到正确的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接