计算
进制运算的基础
- 进制概述
- 进制的定义
- 进位制是一种计数方式,亦称进位计数法或位值计数法
- 有限种数字符号来表示无限的数值
- 使用数字符号的数目称为这种进位制的基数或底数
n = 10 [0-9]
称为十进制
- 常见的进制
- 八进制
- 十六进制
- 计算机网卡mac地址
[0-9]和A、B、C、D、E、F
- 计算机网卡mac地址
- 二十进制
- 玛雅文明的玛雅数字
- 因努伊特的因努伊特数字
- 六十进制
- 时间、坐标、角度等量化数据
- 二进制
- 为什么计算机偏向于使用八进制或十六进制?
- 因为计算机底层是二进制管理高低电平的开关,但是二进制表达太长了。所以这个时候就会使用八进制或十六进制,在二进制的基础上进一步的进行编码,缩短整个字符串的长度,可读性也会更高。
- 使用大进制位就可以解决这个问题。
- 八进制、十六进制满足2的n次方的要求
- 例子:用二进制、八进制、十六进制分别表示1024
- 二进制
1024 = 0b1000000000
(12个字符) - 八进制
1024 = 0o2000
(6个字符) - 十六进制
1024 = 0x400
(5个字符)
- 二进制
- 进制的定义
- 二进制运算的基础
正整数N,基数为r。则
N = d↓(n-1)d↓(n-2)...d↓(1)↓d(0)
N = 1024, N = 1 * 10 ^ 3 + 2 * 10 ^ 1 + 4, N = 1000000000, N = 1 * 2 ^ 10
- 二进制转换十进制:按权展开法
N = (01100101) = 1 * 2 ^ 6 + 1 * 2 ^ 5 + 1 * 2 ^ 2 + 1 = 101
N = (11101101) = 1 * 2 ^ 7 + 1 * 2 ^ 6 + 1 * 2 ^ 5 + 1 * 2 ^ 3 + 1 * 2 ^ 2 + 1 = 237
- 十进制转换二进制:重复相除法
- 将10进制的101转换成2进制的范例
-
重复除以2 得商 取余数 101/2
50 1 50/2
25 0 25/2
12 1 12/2
6 0 6/2
3 0 3/2
1 1 1/2
0 1 - 取余数 从下往上,十进制101转二进制结果为
1100101
- 根据按权展开法将
1100101
转为十进制为1 * 2^6 + 1 * 2^5 + 1 * 2^2 + 1 = 64 + 32 + 4 + 1 = 101
- 根据按权展开法将
-
- 将10进制的101转换成2进制的范例
- 【小数】二进制转十进制:按权展开法
N = (0.11001) = 1 * 2^-1 + 1 * 2^-2 + 1 * 2^-5 = 0.78125 = 25 / 32
N = (0.01011) = 1 * 2^-2 + 1 * 2^-4 + 1 * 2^-5 = 0.34375 = 11 / 32
- 【小数】十进制转换二进制:重复相乘法
- 将小数10进制的25/32转换成2进制的范例
-
重复乘以2 得积 取1 25/32
50/32=1又9/16 1 9/16
18/16=1又1/8 1 1/8
1/4=0又1/4 0 1/4
1/2=0又1/2 0 1/2
1=1又0 1 - 取余数 从上往先,十进制25/32转二进制结果为
11001
- 根据按权展开法将
11001
转为十进制为N = 0.11001 = 1 * 2^-1 + 1 * 2^-2 + 1 * 2^-5 = 0.78125 = 25/32
- 根据按权展开法将
-
- 负次方:负次方是一个数学名词,一个数的负次方即为这个数的正次方的倒数。
- 将小数10进制的25/32转换成2进制的范例
- 二进制转换十进制:按权展开法
有符号与无符号数
- 在计算机中使用0表示正数,使用1表示负数
- +237 = 011101101
- -237 = 111101101
- ↑↑↑ 以上示例有个问题,如何判断是数字位还是符号位
- 二进制16位原码表示法
- 原码表示法
- 使用0表示正数,1表示负数
- 规定符号位位于数值第一位
- 表达简单明了,是人类最容易理解的表示法
- 原码表示法的注意事项
- 0 有两种表示方法:00、10
- 原码进行运算非常复杂,特别是两个操作数符号不同的时候
- 需要判断两个操作数绝对值的大小
- 使用绝对值大的数减去绝对值小的数
- 对于符号值,以绝对值大的为准
- 为了优化原码表示法的计算流程,所以需要注意以下3点
- 尽可能找到不同符号操作数更加简单的运算方法
- 尽可能找到使用正数代替负数的方法
- 使用加法操作代替减法操作,从而消除减法
- 原码表示法
- 二进制16位原码表示法
- ↑↑↑ 以上示例有个问题,如何判断是数字位还是符号位
二进制的补码表示法
- 为了弥补原码表示法的缺陷,衍生出了补码表示法
- 补码的定义
- 例子1:n = 4, x = 13, 计算x的二进制原码和补码
- 原码:
x = 0,1101
- 补码:
x = 0,1101
- 原码:
- 例子2:x = -13, 计算x的二进制原码和补码
- 原码:
x = 1,1101
- 补码:
2^n+1 + x = 2^4+1 - 13 = 100000 - 1101 = 1,0011
- 补码:
x = 1,0011
- 原码:
- 例子3:
x = -7
,计算x的二进制原码和补码- 原码:
x = 1,0111
- 补码:
2^n+1 + x = 2^4+1 - 7 = 100000 - 0111 = 1,1001
- 补码:
x = 1,1001
- 原码:
- 例子4:x = -1,计算x的二进制原码和补码
- 原码:
x = 1,0001
- 补码:
2^n+1 + x = 2^4+1 - 1 = 100000 - 0001 = 1,1111
- 补码:
x = 1,1111
- 原码:
- 例子1:n = 4, x = 13, 计算x的二进制原码和补码
二进制的反码表示法
- 引进补码的目的
- 减法运算复杂,希望找到使用正数替代负数的方法
- 使用加法代替减法操作,从而消除减法
- 在计算补码的过程中,还是使用了减法!
- 反码的目的是找出与原码和补码之间的规律,消除转换过程中的减法
- 优化补码表示法中
2^n+1 + x = 2^4+1 - 1 = 100000 - 0001 = 1,1111
的100000 - 0001
减法操作,由此反码可以解决
- 反码的定义
- 例子1:
x = -13
, 计算x的二进制原码和反码- 原码:
x = 1,0111
- 反码:
(2^n+1 - 1) + x = (2^4+1 - 1) - 13 = 011111 - 1101 = 10010
- 反码:
1,0010
- 原码:
- 例子2:
x = -7
, 计算x的二进制原码和反码- 原码:
x = 1,0111
- 反码:
(2^n+1 - 1) + x = (2^4+1 - 1) - 7 = 011111 - 0111 = 11000
- 反码:
1,1000
- 原码:
- 例子1:
- 以上的两个例子就是反码的计算过程,但是未解决
(2^n+1 - 1) + x = (2^4+1 - 1) - 7 = 011111 - 0111 = 11000
的011111 - 0111
类似这种减法操作,为了解决这个问题,我们可以查看一下原码和反码的关系,寻找规律,如下图所示。- 例子3:x = -7, 计算x的二进制原码和反码和补码
- 原码:
x = 1,0111
- 反码:
x = 1,1000
- 补码:
x = 1,1001
- 原码:
- 例子4:x = -9, 计算x的二进制原码和反码和补码
- 原码:
x = 1,1001
- 反码:
x = 1,0110
- 补码:
x = 1,0111
- 原码:
- 例子3:x = -7, 计算x的二进制原码和反码和补码
总结:原码对零的表示有歧义,并且它的减法运算非常复杂,这个时候就引进了补码表示法,补码虽然解决了原码的这两个问题,但是依旧在算补码的过程中引进了减法,最终引进了反码来消除减法操作
小数的二进制补码表示法
- 小数补码的定义
- 例子1:
x = 9/16
, 计算x的二进制原码和反码和补码- 原码:
x = 0,0.1001
- 反码:
x = 0,0.1001
- 补码:
x = 0,0.1001
- 原码:
- 例子2:`x = - 11/32, 计算x的二进制原码和反码和补码
- 原码:
x = 1,0.01011
- 反码:
x = 1,1.10100
- 补码:
x = 1,1.10101
- 原码:
定点数与浮点数
- 定点数的表示方法
- 小数点固定在某个位置的数称之为定点数
- 纯小数:
[[符号位][小数点][数值位]]
- 纯整数:
[[符号位][数值位][小数点]]
- 纯小数:
- 假设要表达的一个数既不是纯小数也不是纯整数时,就需要乘以比例因子以满足定点数保存格式
- 小数点固定在某个位置的数称之为定点数
-
浮点数的表示方法
- 计算机处理的很大程度上不是纯小数或纯整数
- 数据范围很大,定点数难以表达
- 浮点数的表示格式
- 浮点数的表示范围
- 单精度浮点数:使用4字节、32位来表达浮点数(float)
- 双精度浮点数:使用8字节、64位来表达浮点数(double)
- 例子1:设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数
13/128
表示为二进制浮点数。 - 例子2:设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数-54表示为二进制浮点数
-
定点数与浮点数的对比
- 当定点数与浮点数位数相同时,浮点数表示的范围更大
- 当浮点数尾数为规格化数时,浮点数的精度更高
- 浮点数运算包含阶码和尾数,浮点数的运算更为复杂
- 浮点数在数的表示范围、精度、溢出处理、编程等方面均优于定点数
- 浮点数在数的运算规则、运算速度、硬件成本方面不如定点数
定点数的加减法运算
定点数的加法运算
假设有A和B两个数相加,在计算机里面将是用补码来进行计算的,这时就会由A的补码加上B的补码等于(A+B)的补码,然后对(A+B)的补码进行一个mod的2^n+1的操作,小数的加法也是如此。
公式:
- 整数加法:A[补码] + B[补码] = [A + B][补码](mod2^n+1)
- 小数加法:A[补码] + B[补码] = [A + B][补码](mod2)
数值位与符号位一同运算,并将符号位产生的进位自然丢掉
定点数的减法运算
- 整数减法:A[补码] - B[补码] = A + (-B)[补码](mod2^n+1)
- 小数减法:A[补码] - B[补码] = A + (-B)[补码](mod2)
-B[补码]
等于B[补码]
连同符号位按位取反,末尾加一
B[补码] = 1,0010101
(-B)[补码] = 0,1101011
定点数的加法运算
- 例子1:A = -110010, B = 001101, 求 A+B
A[补码] = 1,001110
B[补码] = B[原码] = 0,001101
A[补码] + B[补码] = (A + B)[补码] = 1,011011
A + B = -100101
- 例子2:A = -0.1010010, B = 0.0110100, 求 A + B
A[补码] = 1,1.0101110
B[补码] = B[原码] = 0,0.0110100
A[补码] + B[补码] = (A + B)[补码] = 1,0.1100010
A + B = -0.0011110
- 例子3:
- 例子4:
- 判断溢出:
- 双符号位判断法
- 单符号位表示变成双符号位:0 => 00, 1 => 11
- 双符号位产生的进位丢弃
- 结果的双符号位不同则表示溢出
- 例子3
- 例子4
- 双符号位判断法
定点数的减法运算
- 例子5
浮点数的加减法运算
- 流程及原理
浮点数的乘除法运算
- 流程及原理