您的位置:首页 > 其它

原码、反码和补码理解

2012-10-13 15:44 549 查看
计算机中,数的表示形式有三种----原码、反码和补码。概念上是有三种,但是实际上计算机中数字都是以补码的形式存在的。
原码和反码都不能解决+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就又变成负的最小了,不断循环。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: