有符号的整数:
原码 反码 补码
+1 0000 0001 0000 0001 0000 0001(正数的原码、反码和补码相同)
-1 1000 0001 1111 1110 1111 1111(负数的反码是原码除符号位取反,补码是反码加1)
数值有正负之分,计算机就用一个数的最高位存放符号(0为正,1为负)。这就是机器数的原码了,假设机器能处理的位数为8,原码能表示的数值范围为-127到-0,+0到127总共256个。
有了数值的表示方法就能够对数进行算术运算。可是很快发现用带符号位的原码进行乘除运算时结果正确,而在加减运算时就出现了问题,谁都知道,1 - 1 = 1 + (-1) = 0
1的原码 0000 0001,-1的原码 1000 0001,若是咱们用原码来计算的话有1 - 1 = 1 + (-1) = 0000 0001 + 1000 0001 = -2,这显然不正确。
由于在两个整数的加法运算中是没问题的,因而就发现问题出如今带负号位的负数身上,对除符号位外的其他各位逐位取反就产生了反码,反码的取值空间和原码相同且一一对应,下面是反码的减法运算:
1的反码 0000 0001,-1的反码 1111 1110,1 - 1 = 1 + (-1) = 0000 0001 + 1111 1110 = 1111 1111 = (-0)有问题。
问题出如今+0和-0上,在人们的计算概念中零是没有正负之分的(印度人首先将零做为标记放入运算之中,包含有零号的印度数学和十进制计数对人类文明的贡献极大)
因而就引入了补码的概念,在补码中用-128代替了-0,因此补码的表示范围为-128到0到127共256个
注意:-128没有相对应的原码和反码-128 = 1000 0000
补码的加减运算
0000 0001 + 1111 1111 = 0000 0000 = 0 正确
因此补码的设计目的是:1)是符号位能和有效值部分一块儿参加运算,从而简化运算规则。2)使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。
两个补码表示的数相加时,若是最高位(符号位)有进位,则进位被舍弃。
补码和原码的转换过程几乎是相同的。
模的概念:模是一个计量系统的计数范围,模其实是计量器产生溢出的量,它的值在计量器上表示不出来,计量器上只能表示出模的余数。任何有模的计量器,都可化减法为加法运算。
对模而言存在一对补数,它们相加等于模,减一个数至关于加上它的补数。对于计算机而言,方法同样,把补数用到计算机对数的处理上就是补码的概念。