视频字幕
计算机需要用二进制来表示正数和负数。最初人们尝试了原码表示法,但原码有一个问题:正零和负零的表示不同,这会造成混淆。接着出现了反码,虽然解决了零的问题,但运算变得复杂。补码是目前计算机中最优的数字表示方法。补码的数学定义是:对于n位二进制数,负数x的补码等于2的n次方加上x。通过这个4位二进制的例子,我们可以看到补码如何统一地表示正负数,并且只有一个零的表示。
补码有两种等价的计算方法。第一种是数学定义法,直接用2的n次方加上负数。第二种是位操作法,先写出正数的二进制表示,然后按位取反,最后加1。让我们用8位系统计算负5的补码来演示这个过程。首先写出5的二进制表示:00000101。然后按位取反得到:11111010。最后加1得到:11111011。我们可以验证这个结果:11111011对应十进制251,而256减5确实等于251,证明两种方法是等价的。
n位补码系统的表示范围是从负2的n-1次方到正2的n-1次方减1。对于8位系统,范围是从负128到正127。这里有一个有趣的特性:负数比正数多一个。这是因为零占用了正数的一个位置。最特殊的是最小负数负128,它的二进制表示是10000000,而这个数的补码就是它自身。我们可以通过数轴看到8位补码系统的完整映射关系,从负128到正127,总共256个不同的值,正好对应8位二进制的所有可能组合。
补码运算的核心优势是加法和减法可以用同一套电路实现。在补码运算中,我们可以忽略最高位的进位,这大大简化了硬件设计。让我们看几个具体例子。首先是正数加正数,5加3等于8,这是最简单的情况。接下来是正数加负数,5加负3。负3的补码是11111101,相加后得到00000010,也就是2,注意我们忽略了最高位的进位。然后是负数加负数,负5加负3。两个负数的补码相加,结果是11111000,对应十进制的负8。最后看减法如何转换为加法,7减5等于7加负5,通过补码运算得到正确结果2。这种统一的运算方式基于模运算的数学原理。
溢出是指运算结果超出了数值表示范围。在补码运算中,只有同号数相加才可能发生溢出:正数加正数或负数加负数。正数加负数永远不会溢出。让我们看具体例子。首先是正常情况,60加50等于110,没有溢出。接下来看溢出情况,100加50,两个正数相加却得到负数负106,这就是溢出。同样,负100加负50,两个负数相加得到正数98,也是溢出。检测溢出有两种方法:符号位检测法是看同号数相加是否变号;进位检测法是比较最高位和次高位的进位,如果不同就是溢出。CPU中的溢出标志位就是基于这些原理实现的。