在计算机内,定点数有3种表示法:原码、反码和补码。反码是数值存储的一种,但是由于补码更能有效表现数字在计算机中的形式,所以多数计算机一般都不采用反码表示数。
在数值数据中分为有符号数与无符号数,其中,有符号数的最高位为符号位,最高位为“0”代表正数,最高位为"1"表示负数。因此对于一个单字节的二进制数而言,有符号数所表示的数值范围为:-127 (11111111) ~ +127 (00000000) ;无符号数的表示范围为:0 ~ 255 [00000000 ~ 11111111]。
原码:最高位为符号位,0代表正数,1代表负数;有符号数除符号位外均为该数的模。
反码:正数的反码与其原码一致,而负数的反码为除符号位外全部按位取反。
补码:正数的补码与其原码一致,而负数的补码为其反码加1.
首先,在计算机中进行加减乘除的算术运算时,计算机都是通过加法和位移运算所实现的。而若是用反码来进行存储数据的话或出现一些问题,具体可以看一下示例:
以减法为例:假设我们要计算5-5,由上述可知,在计算机中实际的操作为5 +(-5)。
当数据用反码存储时,此时5 -5 计算过程即为:00000101 + 11111010=11111111,转换为原码即为-0(10000000);此时就存在这么一个问题,即在计算机中存在+0(00000000)与-0(11111111)两种表示0的二进制数。
而用补码计算时:5-5 = 00000101 + 11111011 = 100000000,可知结果超出了8位,保留后8位,结果即为00000000。
综上的,计算机一般采用补码进行数据存储。