导学
- 这一篇主要介绍数据运算
进制运算
- 进位制是一种计数方式,也称进位计数法
- 使用的数字符号的数目称为此进制的基数或底数,例如十进制0~9
- 常见的还有二进制、八进制、十六进制(都是计算机喜欢的)
二进制表示
- 看下面两个例子:
- 注意是从0开始的
- 二进制转十进制:按权展开法
- 和上面的例子类似,基数的幂按位相乘再相加
- 小数同理:从-1开始
- 和上面的例子类似,基数的幂按位相乘再相加
- 十进制转二进制:重复相除法,除2取余
- 对小数,则要用重复相乘法:乘2取整
- 对小数,则要用重复相乘法:乘2取整
二进制数据
- 有符号数、无符号数,反码/原码/补码
有符号/无符号
- 有符号数:用0表示正,1表示负
- 无符号数:没有符号位,可视为非负数
表示法
- 二进制的原码表示:
- 十进制转成二进制后即是有符号源码
- 这样表示有两个问题:0有两种
00
和10
即+0和-0 - 两个符号不同的操作数运算尤其复杂
- 补码表示法
- 由于原码不好用,于是出现了正数代替负数、加法代替减法的补码
- 但是,注意,我们这里先看如何表示,不要关注运算!如果想提前理解:推荐链接
- 补码定义:
- 乍一看挺难过的吧?没事,看个例子:最前面的是符号位
- 这里的n为什么是4?这个公式的原理是什么?在运算部分解释
- 反码表示法
- 为了进一步揭示规律,方便后面的运算,引入反码:
- 还是看个例子,套用公式:
- 为了进一步揭示规律,方便后面的运算,引入反码:
- 总结一下,直接上结论:
- 正数三同(原补反相同)
- 负数:
- 原码—>补码:符号位不变,取反+1
- 原码—>反码:符号位不变,取反
- 反码—>补码:+1
- 以上皆是整数,对于小数,我们主要看补码表示法
- 小数反码定义:
- 看个例子:
- 小数反码定义:
二进制运算
- 定点数、浮点数和运算
- 首先,不要混乱;
- 前面是整数和小数的表示问题
- 这的定点数和浮点数都包括了整数和小数,都是针对运算提出的概念;但二者适用场景不同
- 这里解决前面的问题,为什么补码能够简化运算,也要考虑计算机如何存储并计算
表示
- 定点数的表示:
- 小数点固定在某个位置的数
- 看个例子:
- 如果不是纯的呢?需要乘上比例因子满足格式:
- 小数点固定在某个位置的数
- 浮点数的表示
- 有的数据范围很大,定点数难以表达
- 借助于科学计数法理解浮点数的表示格式:
- 这里的
r
一般取2 - 尾数必须是纯小数
- 这里的
- 看个例子:
- 注:阶码数值是二进制表示
- 浮点数的表示范围:
- 根据上面的范围,得到上溢和下溢区间:
- 单精度浮点数:4字节表示,即总共有32比特位存储这些阶码、尾数、符号
- 双精度浮点数:8字节表示(double)
- 后面会介绍溢出处理(要考)
- 规格化
- 先来看科学计数法的要求:
- 类比之,浮点数要求尾数最高位必须为1,且纯小数,观察下面的例子:
- 规格化时,根据浮点数的组成对号入座,无需将符号位加入尾数和阶码,数值不够补0
- 浮点数必须要规格化后才能参与运算,一般流程:十进制数—>原码—>规格化
- 后面会发现,尾数用补码运算
- 先来看科学计数法的要求:
- 对比
- 浮点数在范围、精度、溢出处理、编程等方面优于定点数
- 定点数在运算规则、成本、速度等方面优于浮点数
运算
- 定点数加法
- 规则如下:
- 数值位和符号位一起计算,并将产生的进位丢掉
- 看两个例子:
- 关键:符号位参与运算
- 用双符号位法判断溢出:进位同样丢弃,符号相异表示溢出
- 规则如下:
- 定点数减法
- 减法变加法:
- 看个例子:
- 补码的相反数:连同符号位,取反+1
- 减法变加法:
- 浮点数加减法
- 和浮点数的表示类似,有具体的步骤规则:
- 对阶:阶码按小阶看齐大阶的原则:
- 舍弃最后两位,这个舍的问题后面会细说
- 尾数用补码运算,原码表示;当然,补码表示也可!
- 尾数求和:
- 尾数规格化:
- 左规:不满足下面的格式时
- 左规可能进行多次(多次移位)
- 上面的例子不满足格式,左规如下:
- 右规:双符号位不一致时,进行右移操作(只一次),需要考虑舍入问题:
- 小结:左移补0,右移补1/0(和剩下的符号位一致),阶码改变
- 左规:不满足下面的格式时
- 溢出判断:和定点数不同,浮点数双符号位不同不一定溢出,经过上面的尾数规格化之后根据阶码双符号位判断
- 阶码符号位一致则未溢出
- 和浮点数的表示类似,有具体的步骤规则:
- 浮点数运算小结:
- 以上步骤都是程序化,总结如下:
- 以上步骤都是程序化,总结如下:
- 浮点数乘除法:(了解即可,考的很少)
- 乘法规则:阶码相加,尾数相乘
- 除法规则:阶码相减,尾数相除
- 同样可分为:阶码运算、尾数运算、尾数规格化、舍入和溢出判断
小结
- 本篇主要介绍了二进制的表示和运算,规则还是要记的
- 第一次接触很容易混乱,但把握住一点:任何表示方法主要是为了机器运算的方便,从这一点出发可能会更容易理解这些规则
- 对比存储器的结构便可知其中的原理,最后再解释一下补码的道理:
- 以-11为例,先不考虑符号,二进制表示为1011,逐位求反得0100
- 1011+0100=1111,而1111+1=10000(4位二进制数的模)
- 相当于4位寄存器,最大能表示的数是15,此时+1就要全部清零进位
- 结论:不管几位二进制数,取反后与原码相加再+1都会得到模
- OK,补码代替原码计算,减法变加法,会溢出,模掉溢出部分就可以得到最终计算值,这就是底层原理
- 可以将它理解成一个时钟,用模运算来轮回转化
- 再来考虑符号位,结论是:符号位是计算过程中得到的规律(0表正,1表负),可以当成是数学之美吧!
- 下一篇开始实现之前提到的重要算法