基本概念
原码
:符号位加上真值的绝对值,也就是第一位表示符号。其余位表示值(0为正值,1为负值)
原码是人脑最容易理解和计算的表示方式
反码
:正数的反码是其本身,负数的反码是在其原码的基础上符号位不变,其余各位取反
一个反码表示的负数是无法无法直观地看出其数值的通常需要将其转换为原码在进行计算
补码
:正数的补码是其本身,负数的补码是在其原码的基础上除了符号位进行取反,并且在最后一位加1
对于负数的补码的表示方式也是人脑无法直观的看出其数值的,通常需要转化成原码的形式进行计算
一个小小的栗子:
【+1】 = 【0000 0001】原 = 【0000 0001】反 =【0000 0001】补
【-1】 = 【1000 0001】原 = 【1111 1110】反 = 【1111 1111】补
使用原码,反码、补码的原因
原码:
原码是最简单的整数表示方法,直接使用二进制表示数值,原码的优点是直观,容易理解。然而,原码的缺点是加法和减法运算复杂,需要额外的规则来处理符号位
使用原码进行计算:
1-1 = 1+(-1)=【0000 0001】原+【1000 0001】原 = 【1000 0002】原 = -2 (计算结果是错误的)
原码表示让符号也参加计算,显然对于减法来说计算结果是错误的,这也就是为何计算机内部不使用原码表示一个数的原因
反码:为了解决上面的原码在加减运算值中的问题,而引入了反码:
反码计算:
1-1 = 1+(-1)=【0000 0001】原 + 【1000 0001】原 =【0000 0001】反+【1111 1110】反 =【1111 1111】反 = 【1000 0000】 = -0
通过上面的计算结果可以发现真值部分是正确的,但是出现唯一的问题,在0这个特殊的值人对+0和-0的认识时一样的所以0带符号是没有作用的,但是0会出现两个不同的原码。
为了解决上面计算所出现的正零和负零的问题补数出现了
补码:为了解决反码的正零和负零问题,补码被引入
补码计算:
1-1 = 1+(-1) = 【0000 0001】原 +【1000 0001】原 = 【0000 0001】反 + 【1111 11110】反 = 【0000 0001】补 + 【1111 1111】补 = 【1 0000 0000】补 =【0000 0000】原 = 0
注意:进位1不在计算机字长中
使用【1000 0000】表示-128 的由来:
(-1)+(-127) = 【0000 0001】原 + 【1111 1111】原 = 【1000 0001】补 +【10000 0001】补 = 【1000 0000】补
通过上面的计算可以验证-128的补码为【1000 0000】补但是-128没有原码和反码,反码和原码的适用范围为【-127,127】补码的使用范围时【-128,127】