原码、反码和补码理解

来源:互联网 发布:数控螺纹g76编程格式 编辑:程序博客网 时间:2024/05/29 05:10

计算机中,数的表示形式有三种----原码、反码和补码。概念上是有三种,但是实际上计算机中数字都是以补码的形式存在的。

原码和反码都不能解决+0和-0的问题。

[+0]原=0 0000000 (假设是八位)

[-0]原=1 0000000

正数的原反补都是一样的。

看下-0的反码,负数的反码是符号位不动,其余各位取反。

[-0]反=1 1111111

不论原码还是反码,对于同一个0,却有两种不同的状态,对于8位机器数来说,8位共有256中不同的状态,理论上是可以表示256个数的。但是由于一个0就占了两种状态,所以实际上原码和反码只能表示255个数,(0 1111111)表示127 最小的只能到-127(1 1111111),共255个数字。

补码解决了+0和-0不同状态的问题,来看下。

+0和原来还是一样的(0 0000000),看下-0,负数的补码是在反码的基础上末尾加1

[-0]反=1 1111111,末尾加1会导致进位溢出,将溢出位丢掉变成0 0000000。所以和原码是一样的。由于补码的0状态的统一,所以8位机器数的补码是可以表示256个数的。最大的和原来是一样的+127(0 1111111),按照这样推理,负数应该能能表示到-128才能一共有256个数。那么-128的补码是多少呢?实际上,补码有这样的规律,它是不断循环的,将+127加1就变成了-128。

所以-128的补码是0 1111111+1=1 0000000.

那么将-128加1是-127么?显然是这样的。看下  1 0000000+1=1 0000001

将1 0000001转成原码。将补码转成原码有两种方法。

1. 一个数补码的补码就是原码,所以只要将1 0000001再求补码,就是它的原码了。

2. 求补码的过程逆向,就是将补码的先减1,再除符号位以外取反。

显然,1 0000001转成原码后是1 1111111,这个数显然是-127了。

再将-1的补码试着加1看是否是0

[-1]补=1 1111111+1=0 0000000,的确是0

所以从上面可以看出,一个数的补码表示形式是循环的,对这个数不断的加1会由负的最小逐渐的增加到0,再由0逐渐的增加到正的最大,此时再加1就又变成负的最小了,不断循环。