原码、反码和补码是在计算机中用来表示和处理整数的三种表示方法:
-
原码(Sign-Magnitude):原码是最简单直观的整数表示方法,其中最高位表示符号位(0表示正数,1表示负数),其余位表示数值部分的绝对值。但是原码存在正零和负零两个零的表示,而且加减法运算复杂,所以并不常用。
-
反码(One's Complement):反码是在原码的基础上改进而来,负数的表示方法是将其绝对值的原码按位取反得到。负数的反码最高位为1,但没有正零和负零的问题。然而,反码也存在加减法运算时需要处理进位的问题。
-
补码(Two's Complement):补码是最常用的整数表示方法,负数的表示是将其绝对值的原码按位取反后加1。补码只有一个零,同时加减法运算可以统一处理正数和负数,无需额外的逻辑。因此,补码是计算机中处理整数运算的首选表示方法。
总结起来,原码是最基础的表示方法,反码是对原码的改进,而补码是在反码基础上进一步优化得到的,具有更好的运算性质和效率。在实际计算机系统中,通常使用补码来表示负数。
反码
反码是一种表示负数的方法,也称为二进制反码。在计算机中,反码通常用于表示负数,类似于补码。反码的表示方法如下:
- 对于正数,其反码就是其二进制表示(符号位为0)。
- 对于负数,其反码是将其绝对值的二进制表示按位取反(0变1,1变0),符号位保持不变。
举个例子:
- 对于十进制数 -5,其二进制表示为 1011,取反得到 0100,符号位保持为1,即反码为 1100。
- 对于十进制数 3,其二进制表示为 0011,即正数的反码就是其本身。
反码和补码的区别在于负数的表示方法不同。在补码中,负数的表示是在反码的基础上再加1。而在反码中,负数的表示只是简单地取反,不需要额外的加1操作。
补码
补码是一种表示负数的方法,也称为二进制补码。在计算机中,通常使用补码来表示负数,以方便进行加减运算。补码的表示方式如下:
- 对于正数,其补码就是其二进制表示(符号位为0)。
- 对于负数,其补码是将其绝对值的二进制表示按位取反(0变1,1变0),然后在末尾加1。
举个例子:
- 对于十进制数 -5,其二进制表示为 1011,取反得到 0100,再加1得到补码 0101。
- 对于十进制数 3,其二进制表示为 0011,即正数的补码就是其本身。
补码的一个特点是,加减法可以统一处理正数和负数,而不需要额外的逻辑。这使得计算机在进行算术运算时更加高效和简单。
一个简单的计算例子:
8为2进制signed int最大为01111111,即2^7 - 1,若将该数乘以2,该数字为多少呢?
根据题意,乘以2即位左移一位,即数字变为11111110,发生溢出,此时最高位仍然表示符号位,那么对这个数字取补码即(1全部转换为0,0变为1,最后加1,符号位不变)为10000001+1=10000010=-2。
或者可以这么想,11111110这个数字如果加上10就会变为00000000,10代表的是十进制的2,即原数字+2=0,所以原数字=-2。