补码黑历史
对于每个计算机专业的同学,刚开始都会接触到二进制转换、原码、反码、补码的知识。
国内教材上是如下定义的:
原码:最高位为符号位,0代表整数,1代表复数,非符号位为改数字绝对值的二进制表示。如127的原码为 0111 1111,-127的原码为 1111 1111。
反码:正数的反码与原码一致;负数的反码是对原码按位取反(符号位不变)。如127的反码为 0111 1111,-127的反码为 1000 0000。
补码:正数的补码与原码一致;负数的补码是该数的反码加1。如127的补码为 0111 1111,-127的补码为 1000 0001。
记住上述的定义和转换方法,通过考试so easy。可是,如果做个有心人,难免会有两点疑惑:1)为什么负数和正数的规则会不同,这和我们学习其他概念方式差别很大;2)补码到底有什么用,引入补码本质是为了解决什么问题?
带着上面的疑问,对比下国外的计算机教材的讲解,国内的教材只写结论,对技术产生的背景几乎完全忽略,实际上是本末倒置。如果理解了补码背景,彻底理解补码并不太难。
为什么需要补码
补码是一个工程问题,它是为解决特定工程问题而引入的。
对于8比特的二进制编码,最多可以表示256个不同的值,如果没有负数,我们可以用来表示0~255,如果有负数,我们可以分别表示-128~127。
计算机应该如何表示负数呢?