原码,反码,补码的研究和理解。 2014-08-05 16:42 71人阅读 评论(0) 收藏

虽然大一上,计算机导论课的时候讲过这个问题,但是当时只知道是怎么计算的,并不能理解其中的原理,最近看了一些资料才理解的比较深刻。主要是看了 C语言中int型的取值范围_百度文库 这篇,受益很大。

那篇文章中举了一个例子:假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:    一种是倒拨4小时,即:10-4=6    另一种是顺拨8小时:10+8=12+6=6 。
在以12模的系统(数字只有0~11)中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。 对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。共同的特点是两者相加等于模。

这就是为什么计算机可以把减法转化成加法,而且超出的最高位抹去不要,用的就是这个思想 。

下面我说一下我对原码,反码,补码的理解。还是举一个例子,比如一个四位的整数数据类型0101(也就是5)-0010(也就是2)计算机是怎么把它算成0011(也就是3)的。根据上面的思想,四位整数类型的模是10000。所以-0010相当于+(10000-0010)(实际上这个数就是补码),但是(10000-0010)算起来不是那么方便。所以不如让10000先-1,变成1111,再用这个数来-0010,最后再+1,也和刚才的数一样。1111-0010非常好算了,因为1111每一位都是最大的数1,只需要对应的把每一位的1变成0,0变成1就行了,得到的这个结果是1101(实际上这个就是反码),然后再+1,得到1110(补码)。所以就是0101-0010就和0101+1110=(1)1011最高位的1舍去,即1011(3)。

以上如果用原码反码补码的知识去计算十分相似。

所以我觉得计算机中应该没有反码的概念,反码只是人们模拟计算机运算时算补码比较方便的一个中间产物,计算机中只有原码和补码。


版权声明:本文为博主原创文章,未经博主允许不得转载。

原文地址:https://www.cnblogs.com/wmxl/p/4662723.html