一、计算机中的二进制数表示
(一)数的表示方法
1、定点数2、浮点数
(1)浮点数概念(2)规格化浮点数 (二)数的性质
1、无符号数2、有符号数3、数的性质由设计者决定 二、无符号数
(一)无符号数的加法(二)无符号数的减法(三)无符号数的乘法(四)无符号数的除法(五)乘除法案例演示 三、有符号数
(一)概念(二)表示方法
1、原码
(1)概念(2)优点(3)缺点(4)数0的原码 2、反码
(1)概念(2)案例
例1、-52的反码例2、0的反码 3、补码
(1)概念(2)案例
例1、-52的补码例2、0的补码例3、钟表案例 - 将指针从5点拨到1点 (3)补码的算术运算
例1、计算66-51例2、X = -52 = -0110100,Y = 116 = +1110100,求X + Y的值例3、X = 34 = +0100010,Y = -52 = -0110100,求X + Y的值 (4)编译系统将负数转换成补码(5)特殊数10000000 四、计算机能力的局限性
(一)计算机的运算能力是有限的(二)计算机能够表示的数(表数)的范围是有限的
1、无符号整数的表示范围2、有符号整数的表示范围
(1)原码和反码(2)补码(3)对8位二进制数(4)符号数运算中的溢出判断 五、符号二进制数与十进制的转换
(一)转换方法(二)计算机中的符号数默认以补码形式表示(三)补码数转换为十进制数
1、对正数2、对负数3、案例演示
(1)补码最高位是0的情况(2)补码最高位是1的情况 一、计算机中的二进制数表示 (一)数的表示方法 1、定点数
定点数包括定点整数与定点小数采用定点数的缺点
① 编程时需要确定小数点位置
② 难以表示两个大小相差较大的数
③ 存储空间利用率低 2、浮点数 (1)浮点数概念
小数点的位置可以左右移动的数 (2)规格化浮点数
尾数部分用纯小数表示,即小数点右边第1位不为0
(二)数的性质 1、无符号数
数中所有的0和1都是数据本身各种编码多视为无符号数 2、有符号数
需用0或1表示数的性质(整数)数值多视为有符号数 3、数的性质由设计者决定
在低级语言程序设计中,根据数的性质由程序语言处理(按无符号数或有符号数处理)。 二、无符号数 (一)无符号数的加法
0 + 0 = 0,0 + 1 = 1 ,1 + 0 = 1, 1 + 1 = 0(有进位) (二)无符号数的减法
0 - 0 = 0,0 - 1 = 1(有借位) 1 - 0 = 1,1 - 1 = 0 (三)无符号数的乘法
0 × 0 = 0 0 × 1 = 0,1 × 0 = 0,1 × 1 = 1 (四)无符号数的除法
0 ÷ 0 = 0,0 ÷ 1 = 0,1 ÷ 0 = 0 (无意义),1 ÷ 1 = 1 (五)乘除法案例演示
乘法:00001011 × 0100 = 00101100B除法:00001011 ÷ 0100 = 00000010B
– 商 = 00000010B
– 余数 = 11B每乘以2,相对于被乘数向左移动1位每除以2,相对于被除数向右移动1位 三、有符号数 (一)概念
用最高位表示符号,其余是数值0:表示正数1:表示负数 (二)表示方法 1、原码 (1)概念
最高位为符号位,其余为真值部分 [ X ] 原 = 符 号 位 + ∣ 绝 对 值 ∣ [X]_原=符号位+|绝对值| [X]原=符号位+∣绝对值∣ (2)优点
真值和其原码表示之间的对应关系简单,容易理解 (3)缺点
计算机中用原码进行加减运算比较困难0的表示不唯一 (4)数0的原码
8位数0的原码:
+ 0 = 0 0000000 +0 = colorbox{Yellow}00000000 +0=00000000 − 0 = 1 0000000 -0 = colorbox{Yellow}10000000 −0=10000000
由此可见,数0的原码不唯一。
2、反码 (1)概念对一个机器数X:
若 X > 0 X>0 X>0 ,则 [ X ] 反 = [ X ] 原 [X]_反=[X]_原 [X]反=[X]原若 X < 0 X<0 X<0, 则 [ X ] 反 = 对 应 原 码 的 符 号 位 不 变 , 数 值 部 分 按 位 求 反 [X]_反=对应原码的符号位不变,数值部分按位求反 [X]反=对应原码的符号位不变,数值部分按位求反 (2)案例 例1、-52的反码
X = − 52 = − 0110100 X = -52 = -0110100 X=−52=−0110100
[ X ] 原 = 1 0110100 [X]_原=colorbox{yellow}10110100 [X]原=10110100 [ X ] 反 = 1 1001011 [X]_反=colorbox{yellow}11001011 [X]反=11001011 例2、0的反码
[ + 0 ] 反 = [ + 0 ] 原 = 0 0000000 [+0]_反= [+0]_原= colorbox{yellow}00000000 [+0]反=[+0]原=00000000 [ − 0 ] 原 = 1 0000000 [-0]_原= colorbox{yellow}10000000 [−0]原=10000000 [ − 0 ] 反 = 1 1111111 [-0]_反 = colorbox{yellow}11111111 [−0]反=11111111
由此可见,数0的反码也不是唯一的。
3、补码 (1)概念对于机器数X:
若 X > 0 , 则 [ X ] 补 = [ X ] 反 = [ X ] 原 若X>0, 则[X]_补= [X]_反= [X]_原 若X>0,则[X]补=[X]反=[X]原 若 X < 0 , 则 [ X ] 补 = [ X ] 反 + 1 若X<0, 则[X]_补= [X]_反+1 若X<0,则[X]补=[X]反+1 (2)案例 例1、-52的补码
X = – 52 = – 0110100 X= – 52= – 0110100 X=–52=–0110100
[ X ] 原 = 1 0110100 [X]_原=colorbox{yellow}10110100 [X]原=10110100 [ X ] 反 = 1 1001011 [X]_反=colorbox{yellow}11001011 [X]反=11001011 [ X ] 补 = [ X ] 反 + 1 = 1 1001100 [X]_补= [X]_反+1=colorbox{yellow}11001100 [X]补=[X]反+1=11001100 例2、0的补码
[ + 0 ] 补 = [ + 0 ] 原 = 0 0000000 [+0]_补= [+0]_原=colorbox{yellow}00000000 [+0]补=[+0]原=00000000 [ − 0 ] 补 = [ − 0 ] 反 + 1 = 1 1111111 + 1 = 1 0 0000000 = 0 0000000 [-0]补= [-0]_反+1=colorbox{yellow}11111111+1 =colorbox{red}1colorbox{yellow}00000000=colorbox{yellow}00000000 [−0]补=[−0]反+1=11111111+1=100000000=00000000说明:对8位字长,进位(红色1)被舍掉 例3、钟表案例 - 将指针从5点拨到1点
两钟拨法:
逆时钟拨: 5 − 4 = 1 5 - 4 = 1 5−4=1顺时钟拨: 5 + 8 = 13 = 12 + 1 = 1 5 + 8 = 13= colorbox{red}{12} + 1 = 1 5+8=13=12+1=1 ( 12 12 12为模,自动丢失)
对模12,减法变加法
[ − 4 ] 补 = 12 − 4 = 8 [-4]_补=12-4=8 [−4]补=12−4=8 ( 8 8 8为 − 4 -4 −4的补数) 5 − 4 = 5 + 8 5-4=5+8 5−4=5+8 5 − 4 = 5 + ( − 4 ) = 5 + ( 12 − 4 ) = 5 + 8 = 12 + 1 = 1 5-4=5+(-4)=5+(12-4)=5+8=colorbox{red}{12} +1=1 5−4=5+(−4)=5+(12−4)=5+8=12+1=1 (3)补码的算术运算
通过引进补码,可将减法运算转换为加法运算。
[ X + Y ] 补 = [ X ] 补 + [ Y ] 补 [X+Y]_补=[X]_补+[Y]_补 [X+Y]补=[X]补+[Y]补 [ X − Y ] 补 = [ X + ( − Y ) ] 补 = [ X ] 补 + [ − Y ] 补 [X-Y]_补=[X+(-Y)]_补 =[X]_补+[-Y]_补 [X−Y]补=[X+(−Y)]补=[X]补+[−Y]补 例1、计算66-51
66 − 51 = 66 + ( − 51 ) = 15 66-51=66+(-51)=15 66−51=66+(−51)=15
用二进制补码运算:
[ + 66 ] 补 = [ + 66 ] 原 = 0 1000010 [+66]_补= [+66]_原= colorbox{yellow}01000010 [+66]补=[+66]原=01000010 [ − 51 ] 原 = 1 0110011 [-51]_原=colorbox{yellow}10110011 [−51]原=10110011 [ − 51 ] 补 = 1 1001101 [-51]_补=colorbox{yellow}11001101 [−51]补=11001101 [ 66 − 51 ] 补 = [ + 66 ] 补 + [ − 51 ] 补 = 1 0 0001111 = 0 0001111 = 15 [66-51]_补=[+66]补+ [-51]补= colorbox{red}1colorbox{yellow}00001111=colorbox{yellow}00001111=15 [66−51]补=[+66]补+[−51]补=100001111=00001111=15 例2、X = -52 = -0110100,Y = 116 = +1110100,求X + Y的值
[ X ] 原 = 1 0110100 [X]_原=colorbox{yellow}10110100 [X]原=10110100 [ X ] 补 = [ X ] 反 + 1 = 1 1001100 [X]_补= [X]_反+1=colorbox{yellow}11001100 [X]补=[X]反+1=11001100 [ Y ] 补 = [ Y ] 原 = 0 1110100 [Y]_补= [Y]_原=colorbox{yellow}01110100 [Y]补=[Y]原=01110100 [ X + Y ] 补 = [ X ] 补 + [ Y ] 补 = 1 1001100 + 0 1110100 = 0 1000000 [X+Y]_补= [X]_补+ [Y]_补=colorbox{yellow}11001100+colorbox{yellow}01110100=colorbox{yellow}01000000 [X+Y]补=[X]补+[Y]补=11001100+01110100=01000000最高位是0,说明是正数,补码等于原码,即符号位+真值
∴ X + Y = [ X + Y ] 补 = 0 1000000 = + 1000000 = 64 therefore X+Y=[X+Y]_补=colorbox{yellow}01000000=colorbox{yellow}+1000000=64 ∴X+Y=[X+Y]补=01000000=+1000000=64
例3、X = 34 = +0100010,Y = -52 = -0110100,求X + Y的值[ X ] 补 = [ X ] 原 = 0 0100010 [X]_补=[X]_原=colorbox{yellow}00100010 [X]补=[X]原=00100010 [ Y ] 原 = 1 0110100 [Y]_原=colorbox{yellow}10110100 [Y]原=10110100 [ Y ] 补 = [ Y ] 反 + 1 = 1 1001011 + 1 = 1 1001100 [Y]_补=[Y]_反+1=colorbox{yellow}11001011+1=colorbox{yellow}11001100 [Y]补=[Y]反+1=11001011+1=11001100 [ X + Y ] 补 = [ X ] 补 + [ Y ] 补 = 0 0100010 + 1 1001100 = 1 1101110 [X+Y]_补= [X]_补+ [Y]_补=colorbox{yellow}00100010+colorbox{yellow}11001100=colorbox{yellow}11101110 [X+Y]补=[X]补+[Y]补=00100010+11001100=11101110最高位是1,说明是负数,补码不等于原码,补码不是符号位+真值
∴ X + Y = [ [ X + Y ] 补 ] 补 = [ 1 1101110 ] 补 = [ 1 1101110 ] 反 + 1 = 1 0010001 + 1 = 1 0010010 = − 18 therefore X+Y=[[X+Y]_补]_补=[colorbox{yellow}11101110]_补=[colorbox{yellow}11101110]_反+1=colorbox{yellow}10010001+1=colorbox{yellow}10010010=-18 ∴X+Y=[[X+Y]补]补=[11101110]补=[11101110]反+1=10010001+1=10010010=−18
(4)编译系统将负数转换成补码现代计算机系统中,程序设计时,负数可用“-”表示,由编译系统将其转换为补码。案例演示:若输入数 = − 3 = -3 =−3,程序编译后的值 = F D H =FDH =FDH X = − 3 = − 0000011 X = -3 = -0000011 X=−3=−0000011 [ X ] 原 = 1 0000011 [X]_原=colorbox{yellow}10000011 [X]原=10000011 [ X ] 补 = [ X ] 反 + 1 = 1 1111100 + 1 = 11111101 = F D H [X]_补=[X]_反+1=colorbox{yellow}11111100+1=11111101=FDH [X]补=[X]反+1=11111100+1=11111101=FDH (5)特殊数10000000
对无符号数: ( 10000000 ) B = 128 (10000000)_B=128 (10000000)B=128在原码中定义为: ( 10000000 ) B = − 0 (10000000)_B=-0 (10000000)B=−0在反码中定义为: ( 10000000 ) B = − 127 (10000000)_B= -127 (10000000)B=−127在补码中定义为: ( 10000000 ) B = − 128 (10000000)_B= -128 (10000000)B=−128 四、计算机能力的局限性 (一)计算机的运算能力是有限的
计算机无力解决无法设计出算法的问题无法处理无穷运算或连续变化的信息 (二)计算机能够表示的数(表数)的范围是有限的
计算机的表数范围受字长的限制
对8位机而言
– 无符号数的最大值: 11111111 1111 1111 11111111
– 有符号正数的最大值: 0 1111111 colorbox{yellow}0111 1111 01111111
当运算结果超出计算机表数范围时,将产生溢出
1、无符号整数的表示范围 当计算机中数的运行结果超出表数范围时,则产生溢出。无符号整数的表数范围: 0 ≤ X ≤ 2 n − 1 0 ≤ X ≤ 2^n-1 0≤X≤2n−1( n n n表示字长)无符号数加减运算溢出的判断方法:当最高位向更高位有进位(或借位)时则产生溢出。
2、有符号整数的表示范围 (1)原码和反码
− ( 2 n − 1 − 1 ) ≤ X ≤ 2 n − 1 − 1 -(2^{n-1} -1) ≤ X ≤ 2^{n-1} -1 −(2n−1−1)≤X≤2n−1−1 (2)补码
− 2 n − 1 ≤ X ≤ 2 n − 1 − 1 -2^{n -1}≤ X ≤ 2^{n-1} -1 −2n−1≤X≤2n−1−1 (3)对8位二进制数
原码: − 127 ~ + 127 -127 ~+127 −127~+127反码: - 127 ~ + 127 127 ~+127 127~+127补码: − 128 ~ + 127 -128 ~+127 −128~+127 (4)符号数运算中的溢出判断
两个有符号二进制数相加或相减时,若运算结果超出可表达范围,则产生溢出
溢出的判断方法:最高位进位状态 ⨁ bigoplus ⨁次高位进位状态=1,则结果溢出。
例:最高位进位状态与次高位进位状态不同就会溢出
除法运算溢出时,产生"除数为0"中断
乘法运算无溢出问题
五、符号二进制数与十进制的转换 (一)转换方法 求出真值进行转换 (二)计算机中的符号数默认以补码形式表示原码=符号位+绝对值正数的补码=原码=符号位+绝对值负数的补码≠原码 ⟹ Longrightarrow ⟹负数的补码≠符号位+绝对值 (三)补码数转换为十进制数 1、对正数
补码=反码=原码,且原码=符号位+真值 ⟹ Longrightarrow ⟹正数补码的数值部分为真值 2、对负数
补码≠反码≠ 原码 ⟹ Longrightarrow ⟹负数补码的数值部分≠真值 3、案例演示 (1)补码最高位是0的情况
假设 [ X ] 补 = 0 010111 0 B [X]_补=colorbox{yellow}00101110_B [X]补=00101110B
符号位是0,说明是正数,补码=原码=符号位+真值
因此,真值 = + 010111 0 B ⟹ X = + 10111 0 B = + 46 =colorbox{yellow}+0101110_B Longrightarrow X=colorbox{yellow}+101110_B=colorbox{yellow}+46 =+0101110B⟹X=+101110B=+46 (2)补码最高位是1的情况
假设 [ X ] 补 = 1 101001 0 B [X]_补=colorbox{yellow}11010010_B [X]补=11010010B符号位是1,说明是负数, X ≠ - 101001 0 B X≠colorbox{yellow}-1010010_B X=-1010010B欲求 X X X真值,需对 [ X ] 补 [X]_补 [X]补再取补 X = [ [ X ] 补 ] 补 = [ 1 101001 0 B ] 补 = [ 1 101001 0 B ] 反 + 1 = 1 010110 1 B + 1 = 1 010111 0 B = - 010111 0 B = - 46 X=[[X]_补]_补=[colorbox{yellow}11010010_B]_补=[colorbox{yellow}11010010_B]_反+1=colorbox{yellow}10101101_B+1=colorbox{yellow}10101110_B=colorbox{yellow}- 0101110_B = colorbox{yellow}- 46 X=[[X]补]补=[11010010B]补=[11010010B]反+1=10101101B+1=10101110B=-0101110B=-46