计算
进制运算的基础
- 进制概述
- 进制的定义
- 进位制是一种计数方式,亦称进位计数法或位值计数法
- 有限种数字符号来表示无限的数值
- 使用数字符号的数目称为这种进位制的基数或底数
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
- 二进制转换十进制:按权展开法
- 十进制转换二进制:重复相除法
- 将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进制的范例
- 【小数】二进制转十进制:按权展开法
- 【小数】十进制转换二进制:重复相乘法
有符号与无符号数
- 在计算机中使用0表示正数,使用1表示负数
- +237 = 011101101
- -237 = 111101101
二进制的补码表示法
- 为了弥补原码表示法的缺陷,衍生出了补码表示法
- 补码的定义
补码的定义 - 例子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
类似这种减法操作,为了解决这个问题,我们可以查看一下原码和反码的关系,寻找规律,如下图所示。原码、补码、反码的规律:负数的反码等于原码除符号位外按位取反、负数的补码等于反码 + 1 - 例子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
- 原码:
定点数与浮点数
- 定点数的表示方法
- 小数点固定在某个位置的数称之为定点数
- 纯小数:
[[符号位][小数点][数值位]]
- 纯整数:
[[符号位][数值位][小数点]]
- 纯小数:
- 假设要表达的一个数既不是纯小数也不是纯整数时,就需要乘以比例因子以满足定点数保存格式
- 小数点固定在某个位置的数称之为定点数
-
浮点数的表示方法
-
定点数与浮点数的对比
- 当定点数与浮点数位数相同时,浮点数表示的范围更大
- 当浮点数尾数为规格化数时,浮点数的精度更高
- 浮点数运算包含阶码和尾数,浮点数的运算更为复杂
- 浮点数在数的表示范围、精度、溢出处理、编程等方面均优于定点数
- 浮点数在数的运算规则、运算速度、硬件成本方面不如定点数
定点数的加减法运算
定点数的加法运算
假设有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:
例子3 - 例子4:
例子4 - 判断溢出: