在计算机中,通常使用补码来表示有符号整数,而使用原码来表示无符号整数。补码是最常见的有符号整数表示方法,它可以简化加法和减法的运算,同时只有一个零表示,这样可以避免出现正零和负零的情况。
计算机中的有符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
+13(5位二进制系统)
原码:01110
补码:01110
反码:01110
-11
原码:11011
反码:10100(除符号位以外,数值位取反)
补码:10101(反码+1)
为什么有符号整数用补码表示呢?是因为这样简化了减法运算,把减法运算转换成了加法运算。
假设当前时针指向8点,而准确时间是6点,调整时间可有以下两种拨法:一种是倒拨2小时,即8-2=6;另一种是顺拨10小时,8+10=12+6=6,即8-2=8+10=8+12-2(mod 12).在12为模的系统里,加10和减2效果是一样的,因此凡是减2运算,都可以用加10来代替。
对“模”而言,2和10互为补数。实际上,以12为模的系统中,11和1,8和4,9和3,7和5,6和6都有这个特性,共同的特点是两者相加等于模。对于计算机,其概念和方法完全一样。n位计算机,设n=8,所能表示的最大数是11111111,若再加1成100000000(9位),但因只有8位,最高位1自然丢失(相当于丢失一个模)。又回到了 00000000。
在模为32的系统里,如果我们要计算13-11=2,我们把-11转换成+5,13+5=18 进一位到符号位 数值位剩下2 ,把-11(11011)转换成补码表示10101(数值位就是5,符号位还是1,因为如果数值位相加为18,进一位到符号位里,0+1+1为0,最终得到的数是正数,符合)
在计算机里有符号数就是原码的补码在进行运算,正数补码就是原码,负数补码的数值位变成了:模长-原码数值位,满足我们的预期。补码的设计太伟大了!
ps:
在二进制系统中,模是指数值的最大表示范围,即在不考虑符号的情况下,能够表示的最大数字。对于有符号数,通常使用最高位表示符号位,而其余位表示数值位。
对于4位二进制系统:
无符号数模:2^4 = 16
有符号数: 使用1位表示符号位,剩余3位表示数值位。所以,有符号数的数值范围为 [-8, 7](因为第一位是符号位,0表示正数,1表示负数,剩余3位共有(2^3=8)个数字,但其中一个用来表示0,所以实际表示范围是 [-8, 7])。所以,有符号数值位为3位。