Skip to content

计算

大纲概述

进制运算的基础

  • 进制概述
    • 进制的定义
      • 进位制是一种计数方式,亦称进位计数法或位值计数法
      • 有限种数字符号来表示无限的数值
      • 使用数字符号的数目称为这种进位制的基数或底数
        • n = 10 [0-9] 称为十进制
    • 常见的进制
      • 八进制
      • 十六进制
        • 计算机网卡mac地址 [0-9]和A、B、C、D、E、F
      • 二十进制
        • 玛雅文明的玛雅数字
        • 因努伊特的因努伊特数字
      • 六十进制
        • 时间、坐标、角度等量化数据
      • 二进制
    • 为什么计算机偏向于使用八进制或十六进制?
      • 因为计算机底层是二进制管理高低电平的开关,但是二进制表达太长了。所以这个时候就会使用八进制或十六进制,在二进制的基础上进一步的进行编码,缩短整个字符串的长度,可读性也会更高。
      • 使用大进制位就可以解决这个问题。
      • 八进制、十六进制满足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
    • 【小数】二进制转十进制:按权展开法
      • 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
      • 负次方:负次方是一个数学名词,一个数的负次方即为这个数的正次方的倒数。
        负次方
        负次方

有符号与无符号数

  • 在计算机中使用0表示正数,使用1表示负数
    • +237 = 011101101
    • -237 = 111101101
      • ↑↑↑ 以上示例有个问题,如何判断是数字位还是符号位
        • 二进制16位原码表示法
          原码表示法
          原码表示法
          • 原码表示法
            • 使用0表示正数,1表示负数
            • 规定符号位位于数值第一位
            • 表达简单明了,是人类最容易理解的表示法
          • 原码表示法的注意事项
            • 0 有两种表示方法:00、10
            • 原码进行运算非常复杂,特别是两个操作数符号不同的时候
              • 需要判断两个操作数绝对值的大小
              • 使用绝对值大的数减去绝对值小的数
              • 对于符号值,以绝对值大的为准
            • 为了优化原码表示法的计算流程,所以需要注意以下3点
              • 尽可能找到不同符号操作数更加简单的运算方法
              • 尽可能找到使用正数代替负数的方法
              • 使用加法操作代替减法操作,从而消除减法

二进制的补码表示法

  • 为了弥补原码表示法的缺陷,衍生出了补码表示法
  • 补码的定义
    补码的定义
    补码的定义
    • 例子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

二进制的反码表示法

  • 引进补码的目的
    • 减法运算复杂,希望找到使用正数替代负数的方法
    • 使用加法代替减法操作,从而消除减法
    • 在计算补码的过程中,还是使用了减法!
    • 反码的目的是找出与原码和补码之间的规律,消除转换过程中的减法
    • 优化补码表示法中 2^n+1 + x = 2^4+1 - 1 = 100000 - 0001 = 1,1111100000 - 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
  • 以上的两个例子就是反码的计算过程,但是未解决 (2^n+1 - 1) + x = (2^4+1 - 1) - 7 = 011111 - 0111 = 11000011111 - 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

总结:原码对零的表示有歧义,并且它的减法运算非常复杂,这个时候就引进了补码表示法,补码虽然解决了原码的这两个问题,但是依旧在算补码的过程中引进了减法,最终引进了反码来消除减法操作

总结图示

总结图示

小数的二进制补码表示法

  • 小数补码的定义
    小数补码的定义
    小数补码的定义
  • 例子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 表示为二进制浮点数。
      • 例子1
        例子1
    • 例子2:设浮点数字长为16位,阶码为5位,尾数为11位,将十进制数-54表示为二进制浮点数
      • 例子2
        例子2
  • 定点数与浮点数的对比

    • 当定点数与浮点数位数相同时,浮点数表示的范围更大
    • 当浮点数尾数为规格化数时,浮点数的精度更高
    • 浮点数运算包含阶码和尾数,浮点数的运算更为复杂
    • 浮点数在数的表示范围、精度、溢出处理、编程等方面均优于定点数
    • 浮点数在数的运算规则、运算速度、硬件成本方面不如定点数

定点数的加减法运算

定点数的加法运算
假设有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
    例子3
  • 例子4:
    例子4
    例子4
  • 判断溢出:
    • 双符号位判断法
      • 单符号位表示变成双符号位:0 => 00, 1 => 11
      • 双符号位产生的进位丢弃
      • 结果的双符号位不同则表示溢出
    • 例子3
      例子3
      例子3
    • 例子4
      例子4
      例子4

定点数的减法运算

  • 例子5
    例子5
    例子5

浮点数的加减法运算

  • 流程及原理
    流程及原理
    S是尾数,r是奇数,j是阶码

浮点数的乘除法运算

  • 流程及原理
    流程及原理