定点数和浮点数

在计算机中, 含有小数的数根据存储和处理的方式分为两种:

  1. 定点数
  2. 浮点数

定点数

定点数: 小数点的位置是约定好固定的, 按照顶点的位置分隔出整数部分和小数部分.

如: 25.125 (D, 8bit存储)

  • 整数部分: 25使用二进制表示为11001 (B)
  • 小数部分: 0.125使用二进制表示为 .001 (B)
  • 合并起来就是: 1 1001.001 (B)

上面的例子我们约定了8bit中的前5位作为整数部分, 后3位作为小数部分,
但是这种方式会有两个缺点, 其一是可能会有被浪费的数据位, 其二就是能表示的精度很小.

浮点数

浮点数: 顾名思义就是小数点的位置不固定, 其表示方式类似于科学计数法(规格化).

如: 112.5 (D, 单精度IEEE754标准)

  1. 转二进制 111 0000.1 (B)
  2. 规格化(类似科学计数法) 1.1100 001 * 2^6 其中6是十进制, 其余为二进制
  3. 进行阶码偏移量处理 6 + 127 = 133 (D) = 1000 0101 (B)
  4. 根据 符号位, 阶码, 尾数 的占位进行填充
    0(1位符号位) 10000101(8位阶码) 11100001…补0(23位尾数)

IEEE754标准 单精度为32位 1位符号位 8位阶码 23位尾数 阶码偏移量为127
双精度则是64位 1位符号位 11位阶码 52位尾数 阶码偏移量为1023

进制

进制后缀

  1. 二进制(BIN) B
  2. 八进制(OCT) O或Q
  3. 十进制(DEC) D
  4. 十六进制(HEX) H

进制间相互转换(定点数)

  1. 二进制转十进制(其他进制同理)
  2. 十进制转二进制(其他进制同理)

机器数

机器数的相互转换

正数

原码, 反码, 补码都一样.

负数

反码的转换

  1. 原码->反码: 除了符号位外, 所有位取反.
  2. 反码->原码: 除了符号位外, 所有位取反.

补码的转换

  1. 原码->补码: 除了符号位外, 所有位取反, 最低位+1(也就是反码+1, 注意先取反再+1).
  2. 补码->原码: 除了符号位外, 最低位-1, 所有位取反.

反码和补码的意义

反码和补码的出现都是为了解决计算机不能做减法的问题. 但其实反码已经解决了减法问题了,
但是使用反码会出现一个问题, 就是会出现+0和-0, 也就是0000和1111. 这会导致0的编码值在
计算机中不是唯一的.

需要注意计算机中的加减法都是使用补码进行运算的, 结果也是补码, 但显示的是原码.

补码原理

从结果论的表现的来说, 原理就是利用了模的溢出, 将模的溢出参与到计算当中, 就如同时钟上12-2和12+10的结果是一样的.
至于真正为什么补码要这么设计, 可以看看下面引用的链接.

计算机补码运算背后的数学原理是什么? - Sunanki的回答 - 知乎
https://www.zhihu.com/question/30395946/answer/328785755