无论你在什么基础上,数学都不会改变:
1000
- 0001
========
这是以 10 为底的,更容易看到:
1 0 0 0
- 0 0 0 1
=============
我们从个数列开始(以 0 为底),顶部的数字小于底部的数字,所以我们必须借用,但我们发现下一列没有任何内容,以此类推,所以我们必须继续工作,直到我们可以借一些东西,该值的基数大于它所在的列,所以如果你从数百列借入 10 列的 10 列,那么:
所以先借:
0 10 0 0
- 0 0 0 1
=============
第二次借用:
0 9 10 0
- 0 0 0 1
=============
第三次借用:
0 9 9 10
- 0 0 0 1
=============
现在我们可以将基础工作到一列的幂:
0 9 9 10
- 0 0 0 1
=============
9
在这种情况下可以轻松完成:
0 9 9 10
- 0 0 0 1
=============
0 9 9 9
所以基数为 5:
1 0 0 0
- 0 0 0 1
===================
0 5 0 0
- 0 0 0 1
===================
0 4 5 0
- 0 0 0 1
===================
0 4 4 5
- 0 0 0 1
===================
0 4 4 5
- 0 0 0 1
===================
0 4 4 4
基数为 2:
1 0 0 0
- 0 0 0 0
==============
0 10 0 0
- 0 0 0 0
==============
0 1 10 0
- 0 0 0 0
==============
0 1 1 10
- 0 0 0 0
==============
0 1 1 10
- 0 0 0 0
==============
0 1 1 1
当您在逻辑中实际实现这一点时,二进制补码就会发挥作用,我们从初级编程课程中知道,当我们谈论“二进制补码”时,我们会学习“反转和加一”来否定一个数字。我们从小学数学中知道 x - y = x + (-y) 所以:
0
1000
- 0001
=======
这与:
1 <--- add one
1000
+ 1110 <--- invert
=======
完成:
10001
1000
+ 1110
=======
0111
因此,对于减法,您反转/一个补充第二个操作数和进位并将它们提供给加法器。一些架构反转进位并将其称为借用,有些则保持不变。正如我们在上面看到的那样这样做时,如果没有借位,则执行是 1。如果有借位,则为零。
我相信这只是因为只有 0 或 1,所以这是一个 base 2 的事情。你如何反转一个基数为 10 的数字? 1000 - 1 = 1000 + 9998 + 1,嗯,确实可行。
所以底数 10 100 - 1 = 99,底数 9 100 - 1 = 88,底数 8(八进制)100 - 1 = 77,底数 7 100 - 1 = 66 等等。