补数的概念
如果讲时钟的指针从6拨到2,可以两种操作方式。
- 逆时针拨动4下
- 顺时针拨动8下
这两种方式是等价的,按照逆时针为负顺时针为正的话,在时钟拨动的案例中,+8 是-4以 12 为模的补数。
模的概念:
- 模(或称模数)是一个数值计量系统的计量范围,记作mod或M。
- 只要确定了“模”,就可找到一个与负数等价的正数来代替此负数,该正数就是负数的补数。
- 超出计量范围的数都应该自动舍去模数
【举例】 6+13=19三7(mod 12)
在该8位寄存器中,能表示的无符号定点数最大数值为
,最小值为0。当超过最大值的时候就会舍弃模数(向前再进一位),而后这8位都从0开始。
补数的特点:
- 一个负数可用它的正补数来替代,而这个正补数可以用模数加上负数本身求得。
- 一个正数和一个负数互为补数时,它们绝对值之和即为模数
- 正数的补数即该正数本身(这个不用深究,记住就行)
对特点1来说,前面时钟的案例中[-4]的补数=12+(-4)=+8,同样的[-9]的补数为12+[-9]=+3
对特点2来说,|+8|+|-4|=12,|-9|+|3|=12
寻找一个负数的整补数的意义何在呢?
- 把减法运用加法实现
- 符号位也可以直接参与运算
这样在计算机内部就可以使用加法器来实现减法运算,而不必专门设置减法器,因而降低了硬件的复杂度和成本。
最后因为16超过模数范围自动舍弃模数即16-12得到最终结果4。
补码
将补数的概念应用到计算机内部,便出现了补码这种机器码(机器数)。
- 正数的补码:符号位为0,数值位就是它本身。
- 负数的补码:等于模数加上该负数本身,而模数就是最高位进位的位权值。
定点整数的补码定义:
假设真值x为定点整数,n为x的补码表示中数值位的位数(比特数量),加上1个符号位,x的补码表示共有n+1位,最低位的位权值为
,而最高位(符号位)的位权值为
,因此最高位进位的位权值为
,即模数为
。
0在补码和原码表示时候的区别:
可以看出正数的原码与补码相同,而负数的原码和补码是不同的。
0在原码中有两种表示形式,但是在补码中只有一种表示形式,因此补码可以比原码多表示一个数。
定点小数的补码定义:
假设真值x为定点小数(纯小数),小数点左侧的位为最高位(符号位),其位权值为
,而最高位进位的位权值为
,即模数为
=2。
现代计算机中多采用IEEE754标准表示浮点数,而其中的定点小数采用原码表示,因此通常不会涉及定点小数的补码表示。
相关参考:https://www.cnblogs.com/kevinq/p/4480563.html
补码优缺点:
优点:
- 表示方法使得减法运算可以转换成加法运算。
- 真值0在补码中只有一种表示,这使得补码比原码多表示一个最小负数。
- 符号位可以直接参与运算,运算时符号位的进位作为模会被自动舍弃。
目前计算机中普遍采用补码表示有符号定点整数,例如C语言中char、short、int、long型整数 都是采用补码进行表示的。
缺点:
- 补码的表示相对原码更加复杂。 □原码的数值位与真值的绝对值相同。因此,通过原码可以很容易地得出真值。但是,补码就没有这么简单了。