二进制表示数的三种基本编码方式:原码,反码与补码。

二进制表示数的三种基本编码方式:原码,反码与补码。


原码: 符号位和数字实际值的结合。正数是数值本身,符号位为0;负数是数值本身,符号位为1。8位二进制数的表示范围是[-127, 127]。


反码: 正数是数值本身,符号位为0;负数的数值部分是正数表示的基础上对各个位取反,符号位为1。8位二进制数的表示范围是[-127, 127]。


补码: 正数是数值本身,符号位为0,负数的数值部分是在正数表示的基础上对各个位取反后加1,符号位为1。8位二进制数的表示范围是[-128, 127]。


        三种编码方式对比如表1-1所示。

表1-1 三种编码方式对比
正数/负数 原码 反码 补码
1 0000 0001 0000 0001 0000 0001
-1 1000 0001 11111 1110 1111 1111
2 0000 0010 0000 0010 0000 0010
-2 1000 0010 1111 1101 1111 1110

        为了加速计算机对加减乘除的运算速度,减少额外的识别成本,反码和补码应运而生。以减法计算为例,减去一个数等于加上这个数的负数,例如1-2=1+(-2)= -1。在计算机中延续这种计算思维,不需要额外做符号识别,使用原码计算的结果为1-2=1+(-2)= [0000 0001]原 + [1000 0010]原 = [1000 0011]原 = -3,这个结果显然是不正确的。为了解决这一问题,出现了反码的编码方式。使用反码计算,结果为1-2=1+(-2)= [0000 0001]反 + [1111 1101]反 = [1111 1110]反 = -1,结果正确。但是在某些特殊的情况下,使用反码存在认知问题,例如2-2 = 2 + (-2)= [0000 0010]反 + [1111 1101]反 = [1111 1111]反 = -0,结果中出现了-0,但实际上0不存在+0和-0两种表达方式,他们对应的都是0。随着数字的编码表示的发展,补码诞生了,它解决了反码中+0和-0的问题。例如2-2 = 2+(-2)= [0000 0010]补 + [1111 1110]补 = [0000 0000]补 = 0。补码的出现除解决运算的问题外,还带来一个额外的好处,即在占用相同位数的条件下,补码的表达区间比之前两种表达区间更大。例如,8位二进制编码中,补码表示的范围增大到-128,其对应的补码为[1000 0000]补。8条电路的最大值为0111 1111即127,表示范围因有正负之分而改变为-128~127,二进制整数最终都是以补码形式出现的。正数的补码与原码、反码是一样的,而负数的补码是反码加1的结果。这样使减法运算可以使用加法器实现,符号位也参与运算。

        计算结果需要9条电路表示,用8条电路来表达计算结果会溢出,即在数值运算过程中,超出规定的表示范围。一旦溢出,计算结果就是错误的。在各种编程语言中,均规定了不同数字类型的表示范围,有相应的最大值和最小值。

        在以上示例中的一条电路线在计算机中被称为1位,即1个bit,简写为b。8个bit组成一个单位,称为一个字节,即1个Byte,简写为B。1024个Byte,简写为KB;1024KB,简写为MB;1024MB,简写为GB,这些都是计算机中常用的存储计量单位。

猜你喜欢

转载自blog.csdn.net/weixin_43222122/article/details/104297505