关于补码原理机制详解

在计算机中,我们使用补码来描述负数与正数。但许多人都不明白为什么这样做,大家都只知道正数的补码是它的本身,负数的补码是取反加1。但是为什么我们需要补码这个东西?许多人可能都不太明白。其实引用补码的目的是为了解决计算机运算中减法问题。由于计算机不是人,所以无法区分加法与减法,所以我们需要引入一种运算规则同时满足加法与减法运算规则。补码由此诞生。

对于计算机而言加法易于实现,所以计算机中有加法器。那么如何利用加法器完成减法运算就是一个需要解决的问题。

在计算过程中我们常常强调要避免结果数据溢出(即计算结果超过数据的表示范围),然而我们就是通过数据溢出来实现减法运算。

大家可能会发现一个有意思的现象一个字节的表示范围是-128~127;恰好为2^8个数字。这不是巧合,正是如此设计才实现了减法运算通过加法来实现。

首先举一个简单的例子:

   1111 1101  // -3      (一字节)
+  0000 0111  //  7
--------------------     
 1 0000 0100  //   等价于  0000 0100  // 4

 //前面的1溢出,所以结果为4

看到这儿有的小伙伴可能已经明白了,通过溢出用加法来实现减法运算。但是我们怎么表示负数。所以接下来的问题就是用什么来表示负数可以实现这种方法。

看到这儿小伙伴们可能已经猜出来。我们可以通过距离溢出还需要加多少个数值来表示这个负数。

因为差的数值需要另一个加数来补上。

例如一些例子:

-12(差12就可以溢出)  ——————>  1111 0100(-12补码)
-1 (差1 就可以溢出)  ——————>  1111 1111 (-1 补码)
   1111 1101  // -3     需要数值3才可以溢出
+  0000 0111  //  7     提供数值3
--------------------     
 1 0000 0100  //  4     结果

综上,补码可以通过加法运算来实现减法运算。

觉得博主写的通俗易懂的可以点赞关注!!!你们的支持就是我创作的动力呀!!!加油!!

Guess you like

Origin blog.csdn.net/qq_62398971/article/details/122263030