带符号二进制数的表示方法与常用编码
1.原码
字长最高位为符号位,正号用0表示,负号用1表示。
当字长为n位时,X=xn-1 xn-2 … x1 x0
- 整数
0 <= X < 2n-1 X原码=X
-2n-1 < X < 0 X原码=2n-1-X = 2n-1+|X| = 符号位为1,其余各位与数值相同
- 小数
0 <= X < 1 X原码=X
-1 <X <= 0 X原码=1+|X| = 1.xn-1 xn-2 … x1 x0
2.反码
- 整数
0 <= X < 2n-1 X反码=X
-2n-1< X <= 0 X反码=( 2n-1)+X = 符号位保持不变,其余各位按位取反。
- 小数
0<= X <1 X反码=X
-1<X<=0 X反码=( 2-2-(n-1))+X
3.补码
-
整数
0 <= X < 2n-1 X补码=X
-2n-1< X <= 0 X补码=-2n+X = X反码+1 -
小数
0<= X <1 X补码=X
-1<X<=0 X补码=2+X=X反码+ 2-(n-1)
负数的X补码可以由X反码最低位加1实现。
4.带符号数的加减法运算
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
带符号数的加减法运算是由补码来实现的,减去一个数是加上该数负数的补码。
[X+Y]补码=[X]补码+[Y]补码=直接相加,符号位的进位溢出直接扔掉
5.溢出原因
最高数值位有进位,符号位无进位
最高数值位无进位,符号位有进位
即最高数值位与符号位进位情况相同时才不会溢出。
eg.
-
X=7=0111B
Y=10=1010B
X补码+Y补码=00111+01010=10001(溢出) (最高数值位有进位,符号位无进位) -
X= -7 = -0111B
Y= -10 = -1010B
X补码+Y补码=11001+10110=101111(溢出)(符号位有进位,最高数值位无进位)