关于对补码的认识!

来源:互联网 发布:mac窗口最小化快捷键 编辑:程序博客网 时间:2024/06/04 19:55

二进制到底是什么?为什么要采用补码来表示数?如何理解-128的补码呢?

二进制到底是什么?来看一看我们生活中常见的钟表,一圈12小时,事实上钟表一个模12的系统,可能不是很明白。举个栗子:

现在时刻是14:00,三个小时候17:00。也就是2:00 到5:00怎么来的呢,就是14mod12,17mod12得来的。归纳到一般情况就是:对同一计数系统中的数量可以定义运算如相加,但运算结果超出预设位数时,就要发生溢出,这个溢出其实就是模,我们的2进制难道不就是这种情况吗?逢二进一就是这个道理啊!八进制呢?十六进制呢?道理都是一样的!

计算机中,所有数字都以补码形式存储和运算,正数的补码就是符号位0加上它的二进制数,负数的补码就是符号位1加上它的二进制数取反再加1今后,计算机做的事就是拿这些补码加加加,符号位也参与运算,得到的结果也是补码,存储进存储器的也是补码,多方便。

举个栗子,7-9=?,7的补码是00000111,-9的补码是11110111,7+(-9)=11111110,对结果求补得原码10000010就是-2。

那么求负数补码的规则又是怎么来的呢?还记得前面提到的负数A【补】=模-绝对值(A)吗?拿-126举例,绝对值是01111110,模是100000000(2的8次幂即是被表示数的位数),模减去绝对值即为10000010就是-126的补码,而100000000-01111110=(11111111+1)-01111110=(11111111-01111110)+1,仔细一看,(11111111-01111110)的结果10000001不就是126按位取反么?甚至符号位都不需要人为定义,这个首位的1就自然地由取反得到了!最后再加1和书本上的方法也正好吻合!现在回顾一下教科书上的说法:给正数一个符号位0,给负数一个符号位1,取反的时候还要保持符号位不动,翻转后面的数,难道不是多此一举?这样的方法只不过是给不理解补数的人用来死记硬背求补的流程罢了。“符号位”原来不应该是人为了区分正负而生硬规定的,是原本求补过程就存在的一个普通的位置,只是它恰好能够指明数的正负,使人一眼能看出符号,所以才被加了“符号位”这个名字。

请尊重作者原创 这是作者的知乎名:作者:张天行 https://www.zhihu.com/question/28685048/answer/119404608


最后在回顾一下-128的补码 1000 0000 为什么是这样子。负数A【补】=模-绝对值(A)

-128的补码 = 100000000 - 1000 0000 = 1000 0000.这不是巧合,这是真理!在有限的计数系统内,由于位数的限制,发生溢出的情况下无法得到计算真实值,得到的是真实值关于模的补数!


0 0
原创粉丝点击