学习过计算机组成原理的同学可能知道,虽然我们可以让计算机做减法运算,但是计算机内部实际上是在做加法运算。因为加、减、乘、除四则运算都可以分解成加法运算和位移运算,而且计算机也只会处理这两种简单的运算,所以计算机内部会通过一个叫作加法器的电子元件来处理减法运算。
将减法运算转换为加法运算就要用到负数,但是计算机只认识二进制数字,并不认识符号“-”。为了表示负数,人们就规定二进制数的最高位为符号位,符号位是 0 时表示证书,符号位是 1 时表示负数。
举个例子,1 如果用 8 位二进制数来表示的应该是 00000001,最高位也就是左边第一位是 0。那么很同学肯定会觉得 -1 的二进制数应该是 10000001,这样表示会有什么问题呢?我们都知道 1 +(-1) = 0, 但是 00000001 + 10000001 = 10000001,而忽略符号位后,10000001 的表示的十进制数是 1,这显然是不对的,正确答案其实是 11111110。很多同学肯定会有疑问,11111111 去掉符号位后表示的十进制数不是 126 吗?1 的负数怎么可能是126 呢?先别急,我们把 11111111 称作 00000001 的补数。
补数又称为补码,是为了在计算机中表示负数而定义的概念。将一个二进制数的各个位上的数值取反然后再将结果加 1,就可以得到这个二进制数的补数。然后我们来看一下 1 + (-1) 的二进制计算过程: 00000001 + 11111111 = 100000000,得到的是一个 9 位的二进制数,比原来的 8 位多出了 1 位,由于硬件物理上的限制计算机会忽略掉最高位的溢出。因此在计算机看来相加的结果是 00000000,这也就满足了 1 + (-1) = 0。同理,对一个二进制负数求补数,就可以得到相应的正数。