前言
- 同一种二进制数值表示换算成十进制真值时会有多种不同的公式和不同的方法,选用习惯的公式和方法即可。
- 下文中的笔记截图来自于《深入理解计算机系统》+《计算机组成原理(白中英 第五版)》
- 注意区分使用和的情况。一般最高位是或位
- 只有有符号数需要考虑反码和补码
- 当有符号数为整数时,反码=补码
有符号数采用反码和补码的原因
- 原码:无法直接加减,需要考虑符号位,且有+0和-0
- 反码:解决+0和-0问题,但没有解决直接运算问题
- 补码:解决+0和-0以及直接相加减问题
溢出名词
这里对下文会用到的几个溢出名词作解析
- 正上溢出:只数值大小超过了正数中能表示的最大值
- 正下溢出:只在附近,存在某些无法被表示的数值,而当前数值恰好等于这些无法被表示的数值。
- 负上溢出:只数值大小超过了负数中能表示的最小值(绝对值最大)
- 负下溢出:只在附近,存在某些无法被表示的数值,而当前数值恰好等于这些无法被表示的数值。
无符号二进制定点整数的一些识别技巧
- 10000,1后面有4个0,故该二进制数的真值为
- 11111,1后面有4个1,故该二进制数的真值为
定点数
- ,其中是符号位,是数值位。
定点纯小数
机器中的小数很少用定点纯小数表示,一般用IEEE 754标准的浮点数表示法进行表示
原码:signed
- 真值=》原码
- ,约定小数点位于和之间,其中是符号位,定点纯小数的整数部分默认为0。
- 定点纯小数的实际表示:,不是整数部分而是符号位
- 原码=》真值:
- 最小值为
- 最大值为
反码:signed
-
原码=》反码:除了符号位全部取反
-
反码=》原码:除了符号位全部取反
补码:signed
- 原码=》补码:反码+1
- 补码=》原码:补码的反码+1
定点纯整数的表示
- 无符号数没有反码和补码,也没必要使用反码和补码
- 有符号数中,当该数为大于等于0的正数时,原码 = 反码 = 补码
原码:unsigned
- 最小值:0
- 最大值:
原码:signed
- 真值=》原码:添加一个符号位。
- 原码=》真值
- 最小值:
- 最大值:
注意 求和符号的上下界,定点纯整数的原码表示和定点纯小数不同
反码:signed
- 原码 =》反码:除了符号位外所有位取反
- 反码 =》原码:除了符号位外所有位取反
- 直接将反码转换成原码即可得到反码表示的实际真值
- 反码=》真值
- 取值范围和原码相同
补码:signed
-
原码 =》补码:反码+1
-
补码 =》原码:求补码的反码+1
-
补码=》真值
-
-
最小值:
-
最大值:
-
当且仅当反码时,反码+1才会出现往符号位进位的情况。此时原码 = 0。由于大于等于0的整数中,补码 = 原码,故向符号位进位的情况不可能出现。
移码:signed
- 若x的原码是,最高位是符号位,则根据移码的传统定义:
- 例如,x=010101时,移码=110101;x=110101时,移码=010101。显然,移码符号位=1时为正数,符号位=0时为负数。被称为偏置常数。
- 原码=》移码:最高位+1
- 当移码用于IEEE754标准的浮点数中表示阶码时,偏置常数=
有符号补码和无符号数相互转换
- 例如,,注意,w是位数。
理解
- 有符号补码范围:
- 无符号范围:
- 有符号补码 =》无符号:若,则发生了负下溢,则加上。
- 无符号 =》有符号补码:若,则发生了正上溢,则减去
- 定点整数的正上溢和负下溢的方式十分通用,在截断、溢出时十分常见。
定点纯整数的扩展
unsigned
- 无符号数的0扩展不改变真值
signed
- 原码的0扩展不改变真值
- 反码的1扩展不改变真值
- 补码的符号位扩展不改变真值
定点纯整数的截断
unsigned
signed
- 有符号数的截断较为复杂,这里不介绍直接公式,建议根据实际情况进行分析。
定点整数运算
- 加减法中只讨论加法。
- 处于区分在真值视角下的运算和在二进制视角下的运算。
真值加法:unsigned
- 对于二进制表示下有w位的定点纯整数
- 无符号加法必然只会发生正上溢,根据上文的结论,正上溢时要减去
真值加法判断进位:unsigned
真值加法:signed
- 同样根据上文的结论,负下溢时加,正上溢时减
真值加法判断进位:signed
二进制加法:unsigned
- 二进制位的正常相加和进位,最高位溢出部分则舍弃。
二进制加法判断进位:unsigned
- 当且仅当至少存在一个加数的最高位=1,相加结果的最高*位=0时,为进位。
二进制加法:signed
- 不考虑原码和反码的加减运算,机器中都采用补码相加减,只有补码才可以将符号位当作数值位进行直接加减
- 二进制位的正常相加和进位,最高位溢出部分则舍弃。符号位当作数值位进行正常运算
二进制加法判断进位:signed
单符号位法
变形补码法
- 在原本的两个二进制加数左侧增加一个和原符号位一样的符号位,则每一个加数都有两个符号位
- 若结果符号位是10,则为负下溢,若结果符号位是01,则为正上溢
浮点数
IEEE 754
- 阶码本身作为一种移码,采用的偏置常数是
- 规格化:
- E = exp - ,exp是E的移码
- M = 1+f
- 非规格化:
- E = 1 - ,1是E的移码
- M = f
浮点数的溢出
- 需要关注的是,浮点数具有定点整数不具有的正下溢和负上溢,且浮点数在浮点数轴上的分布本身就是离散的,而不是连续的(即有的浮点数即使没有过大或者过小,也无法被表示)。