计算机原理-数值的表示方法

1. 数值表示方法

1.1 定点表示法

  • 定义
  1. 定点是指小数点的位置固定不变

  2. 理论上小数点的位置可以固定在任何位置, 但一般是指纯整数表示法. 即小数点在二进制序列最右边

  • 特征
  1. 能表示的数值范围有限

  2. 要求的处理硬件比较简单


1.2 浮点表示法

  • 定义
  1. 把一个数的有效数字和数的范围在一个储存单元表示出来, 这种把数据的范围和精度表示的方法

  2. 相当于小数点位置随比例因子不同, 而在一定范围内可以自由浮动

  • 二进制格式(有顺序): | S | E | M |

其中S为符号位, E为阶码, M称为尾数

E称为阶码, e为实际指数. 其中 E = e + 2k, 这种表示方法称为移码 ( 后面有介绍)

32位浮点数, S占1位, E占8位, M占23位, 浮点数真值 x = (-1)S ✖️ (1.M) ✖️ 2 E-127

64位浮点数, S占1位, E占11位, M占52位, 浮点数真值 x = (-1)S ✖️ (1.M) ✖️ 2 E-1023


​ IEEE754种浮点数的表示范围

单精度(32位)双精度(64位)表示的对象
指数E尾数M指数E尾数M
0000正负零
0非00非0正负规格化数
1~254任意数1~2046任意数正负浮点数
255020470正负无穷
255非02047非0不是一个数(NaN)

2. 数的机器码

机器码解决的问题: 符号和数值位可以一起参与计算

真值: 书写时表示的数, 符号位不占用数值位(简单理解为直白翻译). 如 -1 表示 - 00000001 , 1表示 + 00000001

下面x表示真值, [x]表示原码, [x]表示反码 , [x] 表示补码, [x] 表示移码

其中[x], [x], [x], [x] 可以理解为无符号整数, 真值x有符号


2.1 原码

原码就是在真值的基础上, 将符号位放到数值位的最高位作为数值位. 0表示正, 1表示负

如 -1 的原码就是 10000001 , 1表示为00000001

对于[x] = xnxn-1…x1x0来说,

当x > 0时, [x] = x,

当x < 0时, [x] = 2n - x = 2n + | x |


2.2 补码

这里涉及到一个同余的概念:

  1. 假如一个时钟从7点调到4点, 有两种调法: 时针往后调3, 或时针往前调9, 即 -3 和 +9 对12同余(余数相等), 即 -3 = +9 (mod 12), 负数x对12的同余为 12 + x

  2. 时钟超出12就溢出, 和二进制超出字长溢出原理是一样的, 溢出的周期是字长 2n+1, 正数对2n+1的同余为- (2n+1 -x), 负数对2n+1的同余为 2n+1 + x

  3. 注意: x 和 x + n * T 对周期T的同余, 其中和本身也同余

这里得到的启示是, 可以利用补码将减法转化为加法, 负数转化为正数


补码的定义:

对于[x] = xnxn-1…x1x0来说,

当x > 0时, [x] = x,

当x < 0时, [x] = 2n+1 + x = 2n+1 - | x |

通过补码求真值 x = - 2n xn + ∑ i = 0 n − 1 2 i \displaystyle\sum_{i=0}^{n-1}2^i i=0n12i

已知负数的原码, 求补码的规则如下:

  1. 符号位1不变, 数值位求反(得到反码)

  2. 符号位1不变, 反码数值最低位加1, 得到补码


  • 扩展1: 怎么求正数x对 2n 的最大负同余?

操作: 除符号位外全部取反, 再加1, 符号位取1

  1. 全部取反, 从数学角度就是 2n -1 - x, ( n-1位1的等比数列和减去x )

  2. 再加一, 得到 2n -1 - x + 1 = 2n - x

  3. 再符号取负, 得到 - (2n - x) , 和上述结论是一致的

上述操作可以简化为: 所有位全部取反(包括符号位), 再加1


  • 扩展2: 怎么理解同余和补码的关系?

其实从扩展1的结论可以得出, 补码是一个特殊的同余:

  1. 正数x的补码和原码一致 (同余本身)

  2. 负数-x的补码等于x的最大负同余, 即 [ -x ] = → x 补 \xrightarrow[x补]{} x + 1 (全部位取反再加一)

  • 扩展3: 已知 [x] 求 [-x ]

先说结论: [ -x ] = → x 补 \xrightarrow[x补]{} x + 1 对于任何x都成立

  1. 当x > 0 时, 由扩展2得到 [ -x ] = → x 补 \xrightarrow[x补]{} x + 1
  2. 当x < 0 时亦成立. (推导参考: 大学计算机原理白中英版)

2.3 反码

对于正数来说, 反码和真值x一致.

对于负数来说, 在原码的基础上, 符号位不变, 数值为求反, 这也是求补码的第一步

对于[x] = xnxn-1…x1x0来说,

当x > 0时, [x] = x,

当x < 0时, [x] = 2n + ( 2n -1 - |x|) = 2n+1 -1 - | x |

通过反码求真值 x = - 2n xn + xn + $\sum_{i=0}{n-1}2i $


2.4 移码

移码通常用来表示浮点数的阶码.

移码的定义: [e] = 2 k + e

其中 [e] 为机器数, e为真值, 2 k 为固定的偏移量

对于32位浮点数, 偏移量为127, 对于64位浮点数, 偏移量为1023

假设假设k = 5, 对于正数e = + 10101时, [e] = 1,10101 , 对于负数e = - 10101时, [e] = 0,10101 (在补码的基础上)

从结果可以理解为: 补码和移码仅符号位相反 (对移码来说1代表正, 0代表负)


2.5 机器码的关系

真值x10真值x[x][x][x][x]
-127- 0111111111111111100000001000000100000001
-1- 0000000110000001111111101111111101111111
00000000010000000111111110000000010000000
0000000000000000
+1+ 0000000100000001000000010000000110000001
+127+ 0111111101111111011111110111111111111111
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值