前言

  • 同一种二进制数值表示换算成十进制真值时会有多种不同的公式和不同的方法,选用习惯的公式和方法即可。
  • 下文中的笔记截图来自于《深入理解计算机系统》+《计算机组成原理(白中英 第五版)》
  • 注意区分使用wwnn的情况。一般最高位是w1w-1nn
  • 只有有符号数需要考虑反码和补码
  • 当有符号数为整数时,反码=补码

有符号数采用反码和补码的原因

  • 原码:无法直接加减,需要考虑符号位,且有+0和-0
  • 反码:解决+0和-0问题,但没有解决直接运算问题
  • 补码:解决+0和-0以及直接相加减问题

溢出名词

这里对下文会用到的几个溢出名词作解析

  • 正上溢出:只数值大小超过了正数中能表示的最大值
  • 正下溢出:只在(0,ϵ)(0,\epsilon)附近,存在某些无法被表示的数值,而当前数值恰好等于这些无法被表示的数值。
  • 负上溢出:只数值大小超过了负数中能表示的最小值(绝对值最大)
  • 负下溢出:只在(ϵ,0)(-\epsilon,0)附近,存在某些无法被表示的数值,而当前数值恰好等于这些无法被表示的数值。

无符号二进制定点整数的一些识别技巧

  • 10000,1后面有4个0,故该二进制数的真值为242^4
  • 11111,1后面有4个1,故该二进制数的真值为2412^4-1

定点数

  • x=xnxn1xn2...x0x = x_nx_{n-1}x_{n-2}...x_0,其中xnx_n是符号位,xn1xn2...x0x_{n-1}x_{n-2}...x_0是数值位。

定点纯小数

机器中的小数很少用定点纯小数表示,一般用IEEE 754标准的浮点数表示法进行表示

原码:signed

  • 真值=》原码
  • 机器中的数值表示
  • x=xnxn1xn2...x0x = x_nx_{n-1}x_{n-2}...x_0,约定小数点位于xnx_nxn1x_{n-1}之间,其中xnx_n是符号位,定点纯小数的整数部分默认为0
  • 定点纯小数的实际表示:x=xn.xn1xn2...x0x = x_n.x_{n-1}x_{n-2}...x_0xnx_n不是整数部分而是符号位
  • 原码=》真值:
  • x=(1)xnΣi=1nxni2ix = (-1)^{x_n} · \Sigma_{i = 1}^{n}x_{n-i}2^{-i}
  • 最小值为(12)n1(\frac {1}{2})^n-1
  • 最大值为1(12)n1-(\frac {1}{2})^n

反码:signed

  • 原码=》反码:除了符号位全部取反

  • 反码=》原码:除了符号位全部取反

补码:signed

  • 原码=》补码:反码+1
  • 补码=》原码:补码的反码+1

定点纯整数的表示

  • 无符号数没有反码和补码,也没必要使用反码和补码
  • 有符号数中,当该数为大于等于0的正数时,原码 = 反码 = 补码

原码:unsigned

  • 机器中的数值表示
  • 最小值:0
  • 最大值:2w12^w - 1

原码:signed

  • 真值=》原码:添加一个符号位。
  • 原码=》真值
  • x=(1)xnΣi=0n1xi2ix = (-1)^{x_n} · \Sigma_{i = 0}^{n-1}x_i2^{i}
  • 最小值:(2n1)-(2^n-1)
  • 最大值:2n12^n-1

注意 求和符号的上下界,定点纯整数的原码表示和定点纯小数不同

反码:signed

  • 原码 =》反码:除了符号位外所有位取反
  • 反码 =》原码:除了符号位外所有位取反
  • 直接将反码转换成原码即可得到反码表示的实际真值
  • 反码=》真值
  • 机器中的数值表示
  • 取值范围和原码相同

补码:signed

  • 原码 =》补码:反码+1

  • 补码 =》原码:求补码的反码+1

  • 补码=》真值

  • 机器中的数值表示

  • 最小值:2w1-2^{w-1}

  • 最大值:2w112^{w-1}-1

  • 当且仅当反码x=xnxn1...x0=xn1111...1x = x_n'x_{n-1}'...x_{0}' = x_n'1111...1时,反码+1才会出现xn1x_{n-1}'往符号位进位的情况。此时原码 = 0。由于大于等于0的整数中,补码 = 原码,故向符号位进位的情况不可能出现。

移码:signed

  • 若x的原码是xn+1xnxn1...x0x_{n+1}x_nx_{n-1}...x_0,最高位是符号位,则根据移码的传统定义x=2n+xx_移=2^n+x
  • 例如,x=010101时,移码=110101;x=110101时,移码=010101。显然,移码符号位=1时为正数,符号位=0时为负数。2n2^n被称为偏置常数
  • 原码=》移码:最高位+1
  • 当移码用于IEEE754标准的浮点数中表示阶码时,偏置常数=2n112^{n-1}-1

有符号补码和无符号数相互转换

  • 机器中的数值表示
  • 机器中的数值表示
  • 例如,signed(111)=1,unsigned(111)=7=23+(1)signed(111)=-1, unsigned(111)=7=2^3+(-1),注意,w是位数。
  • 机器中的数值表示

理解

  • 有符号补码范围:2w1<=x<=2w11-2^{w-1} <= x <= 2^{w-1}-1
  • 无符号范围:0<=x<=2w10 <= x <= 2^w-1
  • 有符号补码 =》无符号:若2w1<=x<0-2^{w-1} <= x < 0,则发生了负下溢,则加上2w2^w
  • 无符号 =》有符号补码:若2w11<x<=2w12^{w-1}-1<x<=2^w-1,则发生了正上溢,则减去2w2^w
  • 定点整数的正上溢负下溢的方式十分通用,在截断、溢出时十分常见。

定点纯整数的扩展

unsigned

  • 无符号数的0扩展不改变真值

signed

  • 原码的0扩展不改变真值
  • 反码的1扩展不改变真值
  • 补码的符号位扩展不改变真值

定点纯整数的截断

unsigned

  • 机器中的数值表示

signed

  • 有符号数的截断较为复杂,这里不介绍直接公式,建议根据实际情况进行分析。

定点整数运算

  • 加减法中只讨论加法。
  • 处于区分在真值视角下的运算和在二进制视角下的运算。

真值加法:unsigned

  • 对于二进制表示下有w位的定点纯整数
  • 机器中的数值表示
  • 无符号加法必然只会发生正上溢,根据上文的结论,正上溢时要减去2w2^w

真值加法判断进位:unsigned

  • 机器中的数值表示

真值加法:signed

  • 机器中的数值表示
  • 同样根据上文的结论,负下溢时加2w2^w正上溢时减2w2^w

真值加法判断进位:signed

  • 机器中的数值表示

二进制加法:unsigned

  • 二进制位的正常相加和进位,最高位溢出部分则舍弃。

二进制加法判断进位:unsigned

  • 当且仅当至少存在一个加数的最高位=1,相加结果的最高*位=0时,为进位。

二进制加法:signed

  • 不考虑原码和反码的加减运算,机器中都采用补码相加减,只有补码才可以将符号位当作数值位进行直接加减
  • 二进制位的正常相加和进位,最高位溢出部分则舍弃。符号位当作数值位进行正常运算

二进制加法判断进位:signed

单符号位法

  • 机器中的数值表示

变形补码法

  • 在原本的两个二进制加数左侧增加一个和原符号位一样的符号位,则每一个加数都有两个符号位
  • 机器中的数值表示
  • 若结果符号位是10,则为负下溢,若结果符号位是01,则为正上溢

浮点数

IEEE 754

  • 机器中的数值表示
  • 机器中的数值表示
  • 阶码本身作为一种移码,采用的偏置常数是2n112^{n-1}-1
  • 规格化:
    • E = exp - (2n11)(2^{n-1}-1),exp是E的移码
    • M = 1+f
  • 非规格化:
    • E = 1 - (2n11)(2^{n-1}-1),1是E的移码
    • M = f

浮点数的溢出

  • 需要关注的是,浮点数具有定点整数不具有的正下溢负上溢,且浮点数在浮点数轴上的分布本身就是离散的,而不是连续的(即有的浮点数即使没有过大或者过小,也无法被表示)。

相关文章: