计算机中数的表示形式 原码 反码 补码

  计算机中的数字分为无符号数字和有符号数字。无符号数字对应的二进制位所有位都用来表示数,无符号数字就是正数,其在内存的表示的形式就是其对应的二进制。而对于有符号数字在内存中表示相当麻烦,因为其对应的二进制位中最高位要用来表示数字的正负,并不能所有位全用来表示数字。

  无符号数字,因为其所有二进制位都能用来表示数字,所以对于单字节的二进制位可以表示无符号数的范围区间是[0,255],共256个数字。在计算机内存中,直接用无符号数对应的二进制来表示无符号数是符合逻辑的。

  有符号数字,因为最高位要用来表示数字的正负,所有并不能用其对应的所有二进制位来表示数字。对于单字节的二进制位1111 1111表示为最小数-127,二进制位0111 1111表示最大数127。因此对于单字节的二进制位可以表示有符号数的范围区间是[-127,127],共255个数字,其中二进制位1000 0000表示负0,二进制位0000 0000表示正0。如果这样直接用有符号数对应的二进制在内存中表示这些数就不符合逻辑了,因为无符号数要表示256个,同样有符号也要表示256个数字。如果把1000 0000表示的负0分为-128正好可以,变有符号数的范围为[-128,127],这样就能和无符号数表示范围对应上了。然而计算机在处理数字时,-127+(-1)=-128,在内存中表示 为1111 1111 + 1000 0001 = 1 0000 0000, 单字符溢出后变为0000 0000表示0,并不是1000 000表示的-128;因为计算机只有处理有规律的计算机,所以这种直接用二进制在内存中表示有符号数字的方法明显不能应用,会给硬件CPU设计带来难度。

  计算机的有原码,反码和补码。这些进制位的操作是为了解决有符号数字在内存中表示方式的。

  无符号数字,可以直接使用其对应的二进制来表示内存中的形式,都是正数。所以规定正数原码,反码和补码都是其二进制本身。

  有符号数字,不可以直接使用其对应的二进制来表示内存中的形式,所以要引用原码,反码和补码之间的关系来解决这个问题。-127对应的原码是其二进制1111 1111,反码是1000 0000,补码是1000 0001;127正数原码,反码和补码都是其二进制本身,为0111 1111;把0划给正数时原码,反码和补码都是其二进制本身0000 0000;把0划给负数时原码1000 0000,反码1111 1111,补码1 0000 0000;因为对于数学逻辑而言,并没有正0和负0之分,0既不是正数也不是负数,所以把0000 0000表示的正0定义为0,把1000 0000表示的负0表示为-128。这样对于设计CPU而言也可以减少困难,因为计算机中并没有减法,减法用加上一个数的负数表示。例如-127+(-1) = -128内存补码 + 负1内存补码 = 1000 0001 + 1111 1111 = 1 0000 0000 = 负0的补码 = 规定的-128。这样就能解决硬件CPU设计上的困难;再例如127-1=127内存补码 + 负1的内存补码=0111 1111 + 1111 1111 = 1 0111 1110 = 0111 1110(舍去最高位)=126。

  想要理解上面内容要先复习一下二进制的数学运算,适当了解一下内存的单位字节。

猜你喜欢

转载自www.cnblogs.com/dingyingsi/p/8974044.html