1.原码:
对于0,往往有+0和-0之分,【+0】原=000…0,【-0】原=100…0。
n+1位定点整数原码的表示范围:-(2^n-1)~2^n-1
定点小数原码表示范围:-(1-2^(-n))~1-2^(-n)
一个字节八位,28=256,有256个编码,但是只能表示255个数,因为0占了两个编码。
原码的位扩展:
例:设机器字长为八位,写出+0.375和-0.6875的二进制原码表示。
解:字长为八位,说明数值位为7位,1位符号位。
(+0.375)10=(0.011)2=(0.0110000)2
【0.0110000】原=0.0110000
(-0.6875)10=(-0.1011)2=(-0.1011000)2
【-0.1011000】原=1.1011000
小数的原码扩展,在低位补零,小数点前为符号位。
例:设机器字长为8位,写出+37和-37的二进制原码表示。
(+37)10=(+100101)2
【100101】原=00100101=25H
(-37)10=(-100101)2
【-100101】原=10100101=A5H
优点:乘除法数值位由两个数的绝对值相乘/除得到,符号位由两个数的符号位异或即可。
缺点:a.原码中0的表示有两种,给使用带来了不便。
b.加减法运算复杂。当两个数相加时,如果是同号则数值相加,如果是异号,则要进行减法。
2.补码:【X】补=M+X(Mod M)
当x>=0时,M+X大于M,把M丢掉,所以【X】补=X,即正数的补码等于它本身。
当x<0时,【X】补=M+X=M-|X|,所以负数的补码等于模与该数绝对值之差。
超过模的数要丢掉。
0的补码表示:
纯小数:【+0】补=【-0】补=2+0.00…00=0.00…00(mod 2)
纯整数:【+0】补=【-0】补=2^(n+1) ±00…00=00…00(mod 2)
所以,0的补码表示只有一种形式。
例:-1和-2^n的补码表示(注意和原码的表示范围比较)
对于小数,原码的表示范围为:-(1-2^(-n))~1-2^(-n)最小表示范围是1-2^-n 不能表示-1
对于整数,原码的表示范围为-(2^n-1)~2^n-1(n+1位定点整数)
整数的最小表示范围是-(2^n-1),不能表示-2^n
n+1位纯小数补码表示中
【-1】补=2+(-1)=10.0…0+(-1.0…0)=1.0…0
n+1位纯整数补码表示中:
【-2n】补=2^n+1+(-2^n)=100…0n+1个0+(-10…0)n个0
=10…0n个0
二者用的都是-0的原码,补码中0的表示唯一。-0的原码用来表示小数-1的补码和整数-2^n的补码
所以,补码和原码的表示范围不一样。
对于一个8位的整数,补码的范围为-128~+127
3.补码和原码的关系
正数的补码就是它本身,即若X>=0,【X】原=【X】补
X<0,对【X】原按位取反(符号位不变)在最低位加一得到【X】补,【X】补除符号位外各位取反后,再在最低位加一,可得到【X】原
另一个方法求负数补码:
低位最后一个1不变,这个1之后的0也都不变。
4.【X】补和【-X】补的关系
已知【X】补,将【X】补的各位(含符号位)取反,然后在最低位上加一,得到【-X】补。
5.反码表示
反码中,0的表示不唯一
符号位表示正负。
6.移码
补码表示很难直接判断其值的大小,所以用移码来表示大小。
移码的表示的实质是把真值映像到一个整数域,因此移码的大小可直观的反映真值的大小。
不管是整数还是负数,用移码表示时,可按无符号数比较大小。
移码的模2^n
移码中0的表示唯一。【+0】移=【-0】移=2^n±0.…0=10…0(纯整数)
移码的表示范围与补码一致。
补码的数值部分不变,符号取反,得到得到移码。
移码的顺序和真值完全一致,因此在表示阶码时可以方便的进行大小比较,其结果与真值一致。
浮点数的表示和加减乘除
表示范围和IEEE754将在下一篇提到。