01-2带符号数的代码表示
形式相近, 多了个0
1.2 带符号数的代码表示
真值与机器数 原码、反码和补码 机器数的加、减运算 十进制数的补数
1.2 带符号数的代码表示
数有正负问题,计算机中 如何表示带符号的数?
1.2.1 真值与机器数
真值:直接用“ +” “-” 符号表示的带符号数。 机器不认识,不能在机器中使用。
在没有溢出的情况下:
[X+Y]补 =[X]补+[Y]补。
符号位与数值位一起直接参加运算。 符号位产生的进位位为模可以丢掉。
二、定点补码减法
• 定点补码减法运算规则: [X-Y]补=[X]补+[-Y]补
从Y补求-Y补的法则是:对Y补带符号位 一起求补。
例:已知机器字长n=8,X=44, Y=53,求X-Y=?
1.2.6
十进制数的补数
带符号十进制数也有三种表示方 法,它们分别:符号-数值表示、 “对9的补数”及“对10的补数”。
符号-数值表示
习惯上用0000(等效于十进制数 0)表示正,而用1001(相当于 十进制数9)表示负。 +9 00001001 -9 10011001
十进制数“对10的补数”的减法运 算和二进制数的补码的减法运算相似, 可将减法转换成加法来实现。
例
完成下列数的真值到原码的转换。 X1 = + 1011011 [X1] 原 = 01011011 X2 = [X2]
原
- 1011011 = 11011011
N=+1101001 N=-1101001
N=+ 0 N=- 0
[N]原 = 0 1 1 0 1 0 0 1 [N]原 = 1 1 1 0 1 0 0 1
例 完成下列数的真值到补码的转换。 X1 = + 0 1011011 [X1]补=01011011 X2 = - 0 1011011 [X2]补=10100101
补码的表示范围:
N位纯整数: 2n-1 –1 -2n-1 N位纯小数: 1- 2-(n-1) - 1 均能表示 2n 个数
例:(以8位二进制数为例) [+ 4]补 = [+ 0000100]补 = 0 0000100
符号二进制编码遵循的原则
符号二进制代码化。 编码直观、方便编码。 方便处理(运算)。 N=1+N-1
1.2.2 原码、反码与补码
1. 原码 (Sign Magnitude Numbers)
原码表示法用“0”表示正号,用“1” 表示负号,有效值部分用二进制的绝对值 表示。
小数: X [X]原 = 1-X=1+|X| 0≥X≥-(1-2-(n-1) ) 1- 2-(n-1) ≥X≥0
……真值
机器只能认识二进制数,因此数的正与负
必须用二进制数来表示。用0和1两个代码表示 正和负,并规定一个数的最高位为符号位。从 而得到机器数。
机器数:将符号数值化后的二进制数。机器 能认识。 例如: +1010110 真值 -1010110 符号位 数值 0 1010110 机器数 1 1010110
解:[X]补=00101100,[Y]补=00110101, [-Y]补=11001011 [X]补 = 0 0 1 0 1 1 0 0 [-Y]补= 1 1 0 0 1 0 1 1 + 1 1 1 1 0 1 1 1
[X-Y]补=11110111, X-Y=(-0001001)2=(-9)10
例:已知机器字长n=8,X=-44, Y=-53,求X-Y=?
[+ N]反 = [+ N]原
[- N]反 = 1 [ N ]原
“ 0” 的反码有两种不同的形式。
[+ 0 ]反 = [0] 0 0 0 … 0
[- 0]反= [1] 1 1 1 … 1
二进制的补(two’s complements)
正数与负数的补码是完全不同的。 规则:[+ N]补 = [+ N]原 [- N]补 = [- N]反 + 1 (符号位参与计算)
[+0]反=00000000 ; [-0]反 =11111111
反码所表示的数值范围:(以8位为例) 正数: [+ N]反 = 0 0000000 ~ 0 1111111 即:0~ +127 负数: [-N]反 = 1 0000000 ~ 1 1111111 即:-127~ 0
总结:反码的特点
正数与负数的反码完全不同。
Y=53=32+16+4+1
100000+10000+100+1 =110101来自8=7+1 符号位为0
0110101 00110101
[Y]补=00110101
例:已知机器字长n=8,X=-44, Y=-53,求X+Y=?
解:[44]补=00101100, [53]补=00110101 [X]补=[-44]补=11010100, [Y]补=[-53]补=11001011, [X]补 = 1 1 0 1 0 1 0 0 + [Y]补 = 1 1 0 0 1 0 1 1 [X+Y]补 = 1 1 0 0 1 1 1 1 1 超出8位,舍弃模 值 X+Y=-01100001,X+Y=( -97)
整数:
X
[X]反= (2n -1)+X 0 ≥ X > -2n-1 X3=+1011011 , [X3] 反 =01011011 X4= -1011011 , [X4] 反 =10100100
1 1 1 1 1 1 1 1 1 0 1 1 0 1 1 1 0 1 0 01 0 0
2n-1 > X ≥ 0
符 数值位 号 位
[- 4]补 = [- 0000100]补 = 1 1111011 + 1 = 1 1111100 [-4]反 [+ 0]补 = [+ 0000000]补 = 0 0000000 [- 0]补 = [- 0000000]补 = 1 1111111 + 1 = 0 0000000
1 将十进制数转换成二进制数。 D = - (1101)*2 -6 = - 0.001101 2 对二进制数求补。 D补=1.110011
[+ 0]原 = 0 0 0 0 0 0 0 0
[- 0]原 = 1 0 0 0 0 0 0 0
原码整数的表示范围:
[+0]原 =00000000 ; [-0]原 =10000000 最大值 : 2(n-1)-1 最小值:-(2-(n-1)-1) 表示数的个数: 2n - 1
例 若二进制的位数分别是8、16,求其表示 整数的最大值、最小值及表示数的个数。 8位: 127,-127,255 16位: 32767 , -32767 , 65535
例:已知机器字长n=8,X= 120, Y=10,求X+Y=?
解:[X]补=01111000,[Y]补=00001010, [X]补= 0 1 1 1 1 0 0 0 + [Y]补 = 0 0 0 0 1 0 1 0
1 0 0 0 0 0 1 0 [X+Y]补=10000010 X+Y的真值 ( -130)10 8位计算机数值表达范围:(-128 ~+127) 运算结果超出机器数值范围发生溢出错误。
例 完成下列数的真值到原码的转换 X1 = + 0.1011011 [X1]原=0.1011011 X2 = - 0.1011011 [X2]原=1.1011011
原码小数的表示范围:
[+0]原 =0.0000000 ; [-0]原 =1.0000000 最大值 : 1- 2-(n-1) 最小值:-(1- 2-(n-1)) 表示数的个数: 2n - 1
解:[X]补=11010100,[Y]补=11001011, [-Y]补=00110101 [X] = 1 1 0 1 0 1 0 0 + [-Y] = 0 0 1 1 0 1 0 1 1 0 0 0 0 1 0 0 1
补 补
超出8位(模值),舍弃 [X-Y]补=00001001,X-Y=+0001001 =(+9)
数的符号 正数:+(或省略) 负数:数的符号位:数的最高位 数的符号在r进制数中的表示 正数:0 负数:r-1 数的符号在二进制数中的表示 正数:0 负数:1
9 1=64+16+8+2+1
例 如,
( + 9 1)10 = (+ 1011011)2 ( - 9 1)10 =(- 1011011)2 ……真值
真值
1011 -1011 0.1011 -0.1011 0
原码
01011 11011 0.1011 1.1011 00000 10000
反码
01011 10100 0.1011 1.0100 00000 11111
补码
01011 10101 0.1011 1.0101 00000 补码零的 表示唯一 形式相同
小数: X [x]补= 2+X=2-|X| 0>X≥-1 1- 2-(n-1) ≥X≥0
例 完成下列数的真值到补码的转换。 X1 = + 0.1011011 [X1]补=01011011 X2 = - 0.1011011 [X2]补=10100101
整数: X [x]补= 2n+X=2n-|X| 0>X≥- 2(n-1) 2(n-1) -1 ≥X≥0
11 10 9 8 12 1 2
+8
3
-4
7 6
4
5
两种拨法: