定点数的编码有:原码、补码、移码、反码(用得少)
原码就是用最高位来表示符号,符号位用0与1来表示正负,剩下的数表示数值。对于4位二进制数的原码表示方法中,0即可以用1000表示,也可以用0000表示。用原码表示数值的缺点是:0的表示并不唯一,不利于编程。同时,对原码执行加减操作不方便。
原码通常用来表示定点小数,用来表示浮点数的尾数。
顺便提一手反码: 反码是相对于原码而言的,如果是非负数,反码==原码;如果是负数,那就是符号位不变,数值位按位取反,0变成1,1变成0。
补码
补码的概念离不开模。一个数的补码是多少,只有在确定了模值是多少后才能确定。一个数的补码,就是对一个特定的模值取模。补码主要是为了实现计算机中对加减运算的统一,因为:
结论1:一个负数的补码等于模减该负数的绝对值。
结论2:对于某一确定的模,某数减去小于模的另一数,总可以用该数加上另一数负数的补码来代替。
所有计算机都用补码来表示带符号整数。
怎样求补码?
结论一:0的补码唯一,00…0(n个0)。
结论二:正数的补码就是它本身。
结论三:一个负数的补码等于将对应正数补码各位取反、末位加一。(其正数从右向左遇到第一个1的前面各位取反)
结论四:补码的定义 假定补码有n位,则:[X]补= 2n + X (- 2n-1 ≤ X<2n-1 ,mod 2n) X是真值,[x]补是机器数。
一些特殊数的补码:
[-2n-1]补= 2n - 2n-1 = 10…0(n-1个0)(mod 2n)
[-1]补= 2n - 0…01 = 11…1(n个1) (mod 2n)
[0]补= 0…0 (n个0)
举例:假设机器数为4位,-8的补码:
求补码规律1:补码 = (模 - 绝对值)
[-8]补=16 - 8 = 8 = 1000
求补码规律2:(从右向左遇到第一个1的前面各位取反。记住,这只适用于负数,因为对于非负数(包括0),它们的原码 == 反码 == 补码)
[-8]补= [1000] -----》 1000
怎样根据补码求真值?
简便求法:
如果符号位为0,则为正数,数值部分相同如果符号为位1,则为负数,数值各位取反,末位加1(从右向左遇到第一个1的前面各位取反)例如:[-3]补= 1101(4位) -----》 1011(原码,真值)
移码
移码就是将每一个数值加上一个偏置常数( Excess / bias)。通常,当编码位数为n时,bias取 2n-1 或 2n-1-1(如 IEEE 754)。
移码主要是用来表示定点整数,用于表示浮点数的阶(指数)。