分享

什么是补码?

 林池雨露 2011-12-26
1 补码
======================1.预备知识。==================
注意:此处的'=='是相等的意思。'='是赋值的意思。
在机器世界里:
正数的最高位是符号位0,负数的最高位是符号位1。
对于正数:反码==补码==原码。
对于负数:反码==除符号位以外的各位取反。
     补码==反码+1.
     原码==补码-1后的反码==补码的反码+1。(读完本文后,应该能够直观地认识到本式的正确性)

可以轻易发现如下规律:
自然计算 :a-b==c.
计算机计算:a-b==a+b的补码==d.
c的补码是d.
通过此法,可以把减法运算转换为加法运算。

所以补码的设计目的是:
1.使符号位能与有效值部分一起参加运算,从而简化运算规则.
2.减运算转换为加运算,进一步简化计算机中运算器的线路设计.

=====================2.灵感由来。=================

概念定义:
还记得初中数学里的“补角”的概念吧。
两数之和等于100时,这两个数叫做互为“补数”,100称做“和数”。
如果B+C==100,则
A-B==A-(100-C)==A+C-100.
可以肯定:A-B=A+B的补数-和数。

把这个方法引入机器世界:
设int是8位整数(最高位是符号位),和数H是9位:1 0000 0000.
a,b是任意两int.
显然,a+a的补码==H,H溢出那个最高位之后就剩下了int值0.
①.输入a-b,
②.机器将a-b化个装后喂给加法器:(a的补码)+(-b的补码),它等于c.
不要忘了,c是一个补码.
③.输出:c的原码.

赋值A=a,B=b后,比较一下:
a-b==(a的补码)+(-b的补码)==c.//此处的c是补码形式。
A-B==A+B的补数-和数==C.//此处的C是数字,可以认为它就是原码形式。
if(C>=0) C==c==c的原码;('=='是相等的意思,并非赋值)
else C==c的原码;

这个“补码”中的“补”,跟初中学的那个“补”是一个意思。
数学中的概念名称真还不是随便定义的,比如“数理逻辑”,故名思义就是:用“数学语言”来理清“逻辑”。
补码的表示范围
将原数用二进制表示,最高位是符号位(0表示正数,1表示负数),就是原码表示法。在计算机中的数据都是以补码存放的,只有这样才能减轻CPU。提到补码,就得先说反码,计算机中是这样规定反码的,如果是正数,则按原码形式不变,如127仍为0111,1111;而如果为负数则,第一位为1,其他各位取反(即0变为1,1变为0),如原码-127(1111,1111),表示为1000,0000。补码同上,如果是正数,则按原码形式不变,如127仍为0111,1111;如果为负数,则除第一位为1外,其他各位取反加1,如-127,先取反为1000,0000,然后加1,为1000,0001。但1000,0000比较特殊,用它来表示-128,由此我们可知用补码表示的、带符号的八位二进制数,可表示的整数范围是-128~+127。因此可以得出结论:“正数的反码、补码均与原码相同;负数的反码是原码各位取反;补码则是反码+1”。
  
  
1. 16个二进制位可表示整数的范围是。答案:D(2001年4月考题)  
  (A)0~65535 (B)-32768~32767
  (C)-32768~32768 (D)-32768~32767或0~65535

  解析:16位无符号二进制数最大值是“1111111111111111”,转化为十进制是65535,最小值是全0,因此,表示范围是0~65535。如果是有符号数,除去最高位符号位,最大值是011111111111111,即32767;注意:用补码表示的,带符号的最小值是特殊数“1000000000000000”,表示-32768,而非“111111111111111”,即-32767。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多