第6章 计算机的运算方法
6.1无符号数和有符号数
无符号数
有符号数
1.机器数与真值
2.原码表示法
3.补码表示法
- 由于无论是正数还是负数,得到的补数都可能是0101,为了区分是正数还是负数,要添加一个符号位
- 2 7 ( 符 号 位 ) + 2 7 ( 因 为 是 负 数 , 求 补 数 时 的 方 法 ) + ( − 1011000 ) 2^7(符号位)+2^7(因为是负数,求补数时的方法)+(-1011000) 27(符号位)+27(因为是负数,求补数时的方法)+(−1011000)
- 当然,在引入符号位后,模数也随之而变化了(不然符号位就没啦)
-
由负数的补码得到原码,也可以 ”符号位不变,其余按位取反然后加一“,然后再由原码得到真值
-
如果是 “-0”,根据定义,求补码就是“2(因为小数点前为1位)加上x这个值“,然后2加上负的零,实际上是“10.00000”,然后因为符号位只有一位(取模),前面的1要丢掉,x的补码就是“0.00000”
-
可以发现,正零和负零的补码形式相同,原码形式不同(无论是小数零还是整数零)
-
补码 最大的好处就是 把减法转化成加法
4.反码表示法
-
在原码转成补码的过程中,如果我们不加那个1,就是反码;实际上相当于,把这个模进行了减一,因此模变成了 2 n + 1 − 1 2^{n+1}-1 2n+1−1
-
在补码中我们是模2的,反码是最后那个加一我们不做了,那么如果说数值部分的长度是n位的话,我们最后那个加一,在小数中实际上加的是 2 − n 2^{-n} 2−n,因为,反码的模就是 2 − 2 − n 2-2^{-n} 2−2−n
三种机器数的小结
-
由补码得到原码再得到真值
5.移码表示法
- 由真值得到移码,对正数和负数不做区别
- 移码中,符号位为0的反而是负数,符号位为1的反而是正数
- 通常情况下,因为移码的大小很好判断,所以移码我们通常用来表示浮点数据表示的阶码部分,阶码都是整数,所以,移码的定义中,也只给出了整数形式的定义,没有给出小数形式的定义
6.2 数的定点表示和浮点表示
定点表示
- 定点表示 指的是 小数点按约定方式标出。在计算机中,没有专门的硬件来表示小数点,小数点的位置是由计算机体系结构设计人员在设计计算机体系结构的过程中约定的,在硬件实现和软件实现中都要遵守这个约定
- 根据 小数点约定位置的不同,主要会有两种形式
浮点表示
-
规格化数 就是 数值的最高位是非零的,也就是在二进制表示中这一位是1
-
用有限的数据来表示无限多的实数
-
“保证数的最大精度的前提下“,谁影响数据的精度?—尾数的长度,如果要保证数的最大精度,必需让尾数尽可能的长,因此,要缩短阶码的位数,因此,阶码用4位,这样一共拿出来了6位,剩下的都是尾数部分,因此,尾数部分的长度是18位
-
对浮点数进行规格化表示 的作用就是 尽可能保证数据的精度,如果不进行规格化,尾数的小数点后面可能有若干个零,放在计算机中,尾数的长度是有限的,超出给定长度的那部分尾数的值将被扔掉,会严重影响数据的精度,因此,我们要让它有效的位数尽可能多,因此,采用规格化形式
-
这里说的“尾数最高位为1“中1指的是真值为1
-
如果尾数采用四进制,那么两位二进制数表示了一位四进制数,要想进行规格化的话,那就是尾数的最高的两位不能全部为0
-
在进行尾数的规格化中,如果尾数的基值为4,那么每次移位的时候,无论左右,都要移动两位二进制数的位置,表示的是一位四进制数,这里“左移两位”指的是二进制的两位
举例
-
如何处理除以128,每右移一位相当于除以2,因此,除以128相当于右移7位,那么,我们就可以得到它的二进制形式了
-
在由 定点表示 转化为 浮点规格化形式,首先要确定
小数点所在的位置
,-58是一个整数,那么小数点在定点表示最后面,要把它变成浮点表示,小数点要放在哪个位置呢?“规格化” -
在表示 浮点机 中的 阶码 时,不要忘了题面要求阶码数值部分为4位,因此,在符号位和逗号后面还要补零
-
又要求 阶码用移码表示,尾数用补码表示;因此可以用在浮点机的补码表示的形式下,给出这个值,因为尾数部分都是用补码表示相同的,阶码部分不同要用移码表示,移码和补码的区别就在于符号位,数值部分完全相同,符号位改成1
-
当阶码用移码表示时,阶码是-16,在移码中我们加的是2^n,那么阶码是-16,如果用移码来表示,阶码就是全零
IEEE 754 标准
6.3 定点运算(上)
移位运算
-
负数时,反码中的1相当于真值中的0
-
进行左移一位时,机器数的符号位(0)不动,而是逗号后面的最高位会被丢掉,最低位空出来的位,因此是大于0的,我们要给它补零
-
进行右移一位时,…,因为大于零,所以我们在前面补零
-
左移一位时,符号位不动,移位的仅仅是数值部分,最高位被移掉,虽然移掉的是一个1,但是因为是补码,这个1相当于是0,右侧空出来的一位,根据前面讲的填补代码的规则,给它添上零
-
右移一位时,最高位出现了一个空,根据前面补码的移位规则,这个空位我们要填1,这个1对应了真值中的0
-
负数的补码中,如果左移丢1,这个1对应了真值中的0,所以丢掉1没有任何问题;反而如果丢掉0就会出错
-
负数的补码中,如果右移丢1,这个1对应了真值中的1,所以丢掉之后会影响精度
-
算术移位的符号位不动,符号依然保持着原来的符号,所以算术移位是有符号数的移位
加减法运算
- 其实这两道题都有一个漏洞,那就是没有考虑机器字长,比如-9的二进制形式不一定是图上这种,数值位不一定是4位
-
本题隐含条件 整数型定点机
-
练习1 :这个题中假设,机器字长为5位,包括1位的符号位,而且这台机器是一个存小数的定点机;为什么答案是错误的呢?十进制求出结果应该是 20 16 \frac{20}{16} 1620,这个结果是大于1的,超过了小数定点机能够表示的范围,这种情况叫做
溢出
-
练习2 :这个结果依然是错的。如果机器字长为8位,含有1位符号位,是整数型的定点机,用补码表示的话,表示范围是-128到+127,一共256个数,那么真实计算结果是-138,超出了这种机器数表示方式能够表示的范围,仍然是
溢出
-
如果一正一负相加不会发生溢出
-
比如最高有效位的进位是1,对应了两个正数相加;符号位进位是0;发生溢出
-
比如最高有效位的进位是0,对应了两个负数相加;
-
0、0和1、1这两种情况,都不会发生溢出,对应了两个相同符号的两个数相加,或者是符号不同的两个数相加,
-
在 结果的双符号位不同(10或者01),也就是说溢出的情况下,双符号位的第一个符号位是我们真正的符号位,第二个符号位实际上是运算的数值溢出的部分