文章目录
定点数的表示和运算
定点数的表示
有符号数和无符号数
-
无符号数
机器字长的二进制位均为数值位,无符号
-
有符号数
最高位0/1表示正/负
机器数定点表示
-
定点小数
定点小数是纯小数;
约定小数点位置在符号位之后,有效数值部分最高为之前
-
定点整数
定点整数是纯整数;
小数点位置在有效数值部分的最低位之后
机器数表示方法
-
原码表示法
- 最高位为符号,其余各位表示数的绝对值
- 纯小数的原码
- 字长为n+1
- 范围为 − ( 1 − 2 − n ) < = X < = 1 − 2 − n -(1-2^{-n}) <= X <= 1-2^{-n} −(1−2−n)<=X<=1−2−n
- 关于原点对称
- 纯整数的原码
- 字长为n+1
- 范围为 − ( 2 n − 1 ) < = X < = 2 n − 1 -(2^n-1) <= X <= 2^n -1 −(2n−1)<=X<=2n−1
- 关于原点对称
-
补码表示法
- 补码可以更好的表示加减法
- 纯小数补码
- 表示范围: − 1 < = X < = 1 − 2 − n -1 <= X <= 1-2^{-n} −1<=X<=1−2−n
- 比原码多表示-1(1.0000)
- 纯整数补码
- 表示范围: − 2 n < = X < = 2 n − 1 -2^n <= X <= 2^n-1 −2n<=X<=2n−1
- 比原码多表示 − 2 n -2^n −2n (10000000)
- 补码的算数移位
- 实现除法功能:符号位与数值位一起右移,保持原符号位数值不变
- 变形补码:模4补码(正/负:00/11)
-
反码表示法
- 原码与补码相互转化的过渡
- 纯小数反码
- 表示范围: − ( 1 − 2 − n ) < = X < = 1 − 2 − n -(1-2^{-n}) <= X <= 1-2^{-n} −(1−2−n)<=X<=1−2−n
- 关于原点对称
- 纯整数反码
- 表示范围: − ( 2 n − 1 ) < = X < = 2 n − 1 -(2^n-1) <= X <= 2^n -1 −(2n−1)<=X<=2n−1
- 关于原点对称
-
移码表示法
- 常用来表示浮点数的阶码,只能表示整数
- 最小值: − 2 n -2^n −2n(全零) 最大值: 2 n − 1 2^n-1 2n−1(全1)
- 移码大,真值就大
- 真值零唯一表示
-
不同表示方法之间的项目转化
- 正数:原码,反码,补码相同
- 负数:
- 原码符号位不变,数值位取反得到反码
- 原码符号位不变,数值位取反加1得到补码
- 补码符号位取反得到移码
定点数的运算
定点数移位运算
-
算数移位
-
正数:移位后添0
-
负数:
- 原码添0
- 补码左0右1(从低位向高位找到第一个‘1’时分左右,‘1’包含在右)
- 反码全部添1
-
符号位不参与运算
-
-
逻辑移位
- 将操作数看做无符号数
- 左移或者右移都要添0
-
循环移位
- 带进位标志位的循环移位
- 不带进位标志位的循环移位
- 适合将数据的低字节数据和高字节数据互换
原码定点数的加减法运算
-
加法准则
- 符号相同:绝对值相加,符号不变
- 符号不同:绝对值大的减去绝对值小的,符号取绝对值大的
-
减法准则
- 减数的符号取反,将其与被减数做原码加法运算
补码定点数加减法运算
- 参与的操作数均为补码
- 按照二进制规则运算,逢2进1
- 符号位与数值位同时参与运算,符号位产生的进位丢掉,结果的符号由运算得出
- 补码运算结果仍是补码
符号扩展
- 正数:在原有的基础上,添0凑位即可
- 负数
- 原码:符号位为1,其余和正数相同
- 补码:加1填充(整数)加0填充(小数)
- 补码:加1处理
溢出概念和判断方法
上溢:大于最大可以表示的正数
下溢:小于最小可以表示的负数
补码判断溢出的办法
一位符号位:
A的符号位为 A S A_S AS, B的符号位为 B s B_s Bs,运算结果的符号位为 S s S_s Ss
V = A s B s S s ˉ + A s ˉ B s ˉ S s V = A_sB_s\bar{S_s} + \bar{A_s}\bar{B_s}S_s V=AsBsSsˉ+AsˉBsˉSs
V=0,表示无溢出;V=1表示有溢出
双符号位
00:结果为正数,无溢出
01:结果正溢出
10: 结果负溢出
11:结果为负数,无溢出
一位符号位根据数据位进位判断
符号位与最高数位的进位相同,无溢出,否则溢出
定点数的乘法运算
-
原码一位乘法
- 符号位异或,被乘数和乘数取绝对值运算
- 部分积取n+1位,初值为0
- 根据乘数的最低位
y
n
y_n
yn判断
- y n = 1 y_n=1 yn=1:部分积加上被乘数,右移一位
- y n = 0 y_n=0 yn=0:部分积加0右移一位
- 重复3,判断n次
- 逻辑右移,符号位不参与运算
- 符号位部分积2位,考虑绝对值大于1的情况
-
补码一位乘法(Booth算法)
- 符号位参与运算,补码的算数右移
- 被乘数双符号位;部分积双符号位,初值为0;乘数取单符号位
- 乘数末位为
y
n
y_n
yn,增设
y
n
+
1
y_{n+1}
yn+1
- 00或11:部分积右移1位
- 01:部分积加 [ X ] 补 [X]_补 [X]补,右移一位
- 10:部分积加 [ − X ] 补 [-X]_补 [−X]补,右移一位
- 执行n+1次,n+1次只累加,不移位
定点数的除法运算
-
原码除数运算(恢复余数法)
默认商1,如果余数为负,则需要加上除数,恢复正确的余数,商0;
-
原码除数运算(不恢复余数法)
- 商符和商值分开,符号位不参与运算
- 被减数减去除数
- 余数为正,商1,余数和商左移1位,减去除数
- 余数为负,商0,余数和商左移1位,加上除数
- n+1步余数为负,是需要再加除数,得到正确的余数(余数和被除数号)
-
补码除法运算(加减交替法)
- 符号位参与运算;除数,被除数,商和余数都用补码表示
- 被除数与除数同号,则被除数减去除数;被除数与除数异号,被除数加上除数
- 若余数与除数同号,商1,余数左移1位减去除数;余数与除数异号,商0,余数左移1位加上除数
- 重复3执行n次;加减次数总共n+1次
- 对商的精度没有要求,则一般采用“末位恒置1”法;
强制类型转换
-
有符号数和无符号数的转换
强制转化的结果二进制位值不变,改变了解释这些位的方式
-
不同字长整数之间的转换
- 大字长变量向小字长变量转换
- 高位直接截断,地位直接赋值
- 小字长变量向大字长变量转换
- 负数添1
- 正数添0
- 大字长变量向小字长变量转换
数据的存储和排列
-
大端模式和小端模式
- 多字节数据存放在连续的字节序列
- 大端模式高字节数据放在低地址部分;小段模式相反
- 小端模式便于机器运算
-
边界对齐
- 字节寻址可按字节、半字、字寻址
- 每次访存只能读/写一个字
- 边界对齐方式和边界不对齐方式
- 边界对齐空间换时间的思想