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

Posted dingyingsi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机中数的表示形式 原码 反码 补码相关的知识,希望对你有一定的参考价值。

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

  无符号数字,因为其所有二进制位都能用来表示数字,所以对于单字节的二进制位可以表示无符号数的范围区间是[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],这样就能和无符号数表示范围对应上了。如果这样的话,硬件CPU在处理数据时,-127+(-1)=负127的二进制+负1的二进制=1111 1111 + 1000 0001 = 1 0000 0000, 单字符溢出后变为0000 0000表示正0,并不是1000 000表示的-128;如果非要这么操作,就要增加CPU设计难度,因为计算机最适合处理有规律的计算。所以这种直接用二进制在内存中表示有符号数字的方法明显不能应用,会给硬件CPU设计带来难度。

  计算机的有原码,反码和补码。这些二进制位的操作是为了解决有符号数字在内存中表示方式不足的。原码就是数字本身对应的二进制,反码就是在原码的基础上符号位不变其余位取反,补码是在反码的基础上加1一个二进制位。

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

  有符号数字,不可以直接使用其对应的二进制来表示内存中的形式,所以要引用原码,反码和补码之间的关系来解决这个问题。-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) = 负127内存补码 + 负1内存补码 = 1000 0001 + 1111 1111 = 1 0000 0000=负0的补码 = 规定的负128的补码(因此-128只有规定的补码,并无对应的原码)。这样就能解决硬件CPU设计上的困难;再例如127-1=127内存补码 + 负1的内存补码=0111 1111 + 1111 1111 = 1 0111 1110 = 0111 1110(舍去最高位)=126。

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

以上是关于计算机中数的表示形式 原码 反码 补码的主要内容,如果未能解决你的问题,请参考以下文章

原码反码补码

反码补码原码

原码,补码,反码

原码补码反码和移码

C语言 原码 反码 补码

原码, 反码, 补码 详解