进制运算
进制:使用有限种数字符号来表示无限的数值,使用的数字符号的数目称之为这种进制的基数或者底数。比如说,n=10,称之为十进制。
不常见的进制:
- 二十进制:出现在玛雅文明的玛雅数字,因努伊特的因努伊特数字
- 六十进制:事件、坐标或者是角度等量化的数据
- 十六进制:计算机的网卡、MAC地址
- 八进制:计算机的常见数据类型
为什么计算机喜欢十六进制和八进制呢?
计算机喜欢二进制,但是二进制表达往往太长了,使用大进制位就可以解决这个问题,恰巧十六进制和八进制是2的n次方。
有符号数与无符号数
原码表示法:使用0表示正数,1表示负数,规定数值的第一位是符号位。例如,+237:011101101,-237:111101101。
但是,原码表示法不能满足计算机的要求。第一,0有两个表示方法。第二,原码进行运算非常复杂,特别是两个操作数的符号不同的时候:首先判断两个操作数的绝对值的大小,使用绝对值大的数减去绝对值小的数,对于符号值,以绝对值大的为准。
因此,我们希望找到不同符号操作数更加简单的方法;希望找到使用正数代替负数的方法;希望使用加法操作代替减法操作,从而消除减法。
补码表示法:n表示原码x的位数
由于补码表示法依然使用了减法运算,因此需要找出原码与补码之间的规律,消除转换过程中的减法。由此,产生了反码表示法。
反码-补码的定义:
整数-小数补码的定义:
规律(整数规律):
- 负数的反码等于原码除了符号位以外,按位取反。
- 负数的补码等于反码加1
原码、补码、反码的关系:
定点数与浮点数
定点数
小数点固定在某个位置的数,称之为定点数。分为三种,第一种,把小数点放到符号位和数值位之间,称之为纯小数;第二种,把小数点放到数值位的后面,称之为纯整数。第三种,非纯小数非纯整数。将纯小数或者纯整数乘以比例因子,以满足定点数的保存格式。
浮点数
为什么需要用到浮点数?
- 计算机处理的很大程度上不是纯小数或者纯整数。
- 数据范围往往很大,定点数难以表达,不是也不够灵活。
浮点数的表示形式:尾数必须是纯小数,尾数的最高位必须是1。
浮点数在计算机中如何储存?
举例:
浮点数的表示范围
假设阶码数值取m位,尾数数值取n位。阶码能表示的最大值是(2^m)-1,表达范围是[-((2^m)-1),(2^m)-1];尾数所能表示的最大值是1-2^(-n),尾数表示的最小值时2^(-n),尾数的范围是[-(1-2^(-n)),-2^(-n)]和[2^(-n),1-2^(-n)]。
- 上溢:数的绝对值太大了
- 下溢:数的绝对值太小了
浮点数的表示范围,图示:
- 单精度浮点数:使用4个字节、32位表达浮点数
- 双精度浮点数:使用8个字节、64位表达浮点数
定点数与浮点数对比:
- 定点数与浮点数位数相同时,浮点数的表示范围更大
- 当浮点数的位数为规格化的小数时,浮点数的精度更大
- 浮点数运算包含阶码与尾数,浮点数的运算更为复杂
浮点数在表示范围、精度、溢出处理、编程等方面均优于定点数;而定点数在运算规则、运算速度、硬件成本方面由于浮点数。
定点数的加减法运算
运算方法一:通过补码
运算方法二:
整数的加法、小数的加法:数值位与符号位一同运算,并且将符号位产生的进位自然丢掉,这一步就是mod2^(n+1)或者是mod2的操作。
什么是溢出?
假设A用8位数表示,B也用8位数表示。A+B的结果用8位数存不下来,这种情况叫做溢出。
如何判断溢出?
双符号位判断法,原来用单符号位表示的数用双符号位表示,比如0用00表示,1用11表示。双符号位产生的进位同样丢弃掉,如果结果的双符号位不同,表示溢出。
减法运算:-B的补码等于B的补码连同符号位,按位取反,末位+1
浮点数的加减法运算
步骤
对阶→尾数求和→尾数规格化→舍入→溢出判断。
示例的模型:S表示尾数,r表示基数,j表示阶数
对阶
使两个浮点数阶码一致,使尾数可以进行运算。原则是,小阶看齐大阶。
例如:y的阶码比x的阶码大,x要变成和y的阶码一样。此时,x的位数变成了6位,需要舍去最后面的2位。
尾数求和
和定点数的求和规则是一样的
尾数规格化
S代表尾数,需要判断两种情况,S>0和S<0的情况,需要满足图下的格式:
如果不满足这种格式,或者说符号位与最高位不一致,需要进行移动,同时阶码相应变化,以满足规格化的要求。
尾数规格化一般是数字左移,但是少部分情况需要数字右移。比如,双符号位不一致,定点数运算溢出。右移后,需要进行舍入的操作。
舍入
0舍1入法。如果右移之后,舍去末位的是1,则在舍去之后,需要+1,得到结果。每次一右移,阶码要+1。
溢出判断
定点数判断溢出使用双符号位不一致表示溢出,在浮点数中并不适用,因为浮点数可以通过右移,使符号位变得一致。方法是,通过阶码的双符号位判断是否发生溢出。如果尾数规格化之后,阶码双符号位不一致,则认为该浮点数发生了溢出。
浮点数运算的图示:
浮点数的乘除法运算
- 乘法:阶码相加,尾数相乘
- 除法:阶码相减,尾数相除
之后需要进行,尾数规格化→舍入→溢出判断。