整数运算
计算机中基本的存储单位是 位
,用位来编码整数有无符号数和有符号数两种。
无符号数。指机器字长的全部二进制位均为数值位,没有表示符号的位。如机器字长为 8 位,则无符号数的表示范围为 ,即 。 有符号数。符号无法被机器识别,因此使用位表示符号, 0
表示正号,1
表示负号。通常机器字长中的二进制数的最高位表示符号位。如机器字长为 8 位,有符号数的表示范围为 ,即
补码加法
当值为正数 时,转换为二进制 就是原码、反码与补码的值。当使用加法计算两个正数的值时,它们都能计算正确。
1+1 = 0000 0001
+ 0000 0001
------------
0000 0010 = 2
当值为负数 时,转换为二进制的话,原码、反码与补码就不相同了。
十进制 -1
原码 1000 0001
反码 1111 1110
补码 1111 1111
当计算 1+(-1)
时,原码的计算方式如下所示。
1+(-1) = 0000 0001
+ 1000 0001
------------
1000 0010 = -2
原码的计算结果为 -2
,不是想要的结果,1+(-1)
应该为 0
,原码计算不出来,接下来看下反码的计算方式。
1+(-1) = 0000 0001
+ 1111 1110
------------
1111 1111 = -0
反码的计算结果为 -0
,因为反码有两种方式表示 0
,即 ,。使得 0
这个值不是唯一的,这是绝对不行的。现在来看下补码是如何计算的。
1+(-1) = 0000 0001
+ 1111 1111
------------
1 0000 0000 = 0
补码的计算结果是 0
,上述的进位 1
会丢掉,最终的结果是 0000 0000
。补码运算的结果为补码。
运算时注意机器字长,当左边位出现溢出时,将溢出位丢掉。
补码乘法
计算机中的乘法运算由累加和右移操作实现。对有符号数进行补码乘法,采用的是补码相加和相减操作来计算,补码的符号位参与运算。
设两个数为 和 ,一般的运算规则如下所示。
符号位参与运算,运算的数均以补码表示。 被乘数一般取双符号位参与运算,部分积取双符号位,初值为 0
,乘数可取单符号位。乘数末位增设附加位 ,且初值为 0。 根据 与 比较结果做相应的运算,分三种情况。 当 时,部分积加 ,右移一位。 当 时,部分积右移一位。 当 时,部分积加 ,右移一位。 上述步骤重复 n+1
次,最后一次不再移位。
下面使用补码一位乘法计算 2*(-3)
的值,如下所示。

设机器字长为 5 位,计算出 2
和-3
的补码,由于2
是被乘数,还要计算出-2
的补码。如 ,,。被乘数采用双符号位参与运算,如 ,;乘数采用单符号位,如 。 乘数末位增设附加位,且初始为 0
,即1 1101 0
。第一次计算,根据 ,得到 ,高位部分积为 补 ,低位部分积为 ,右移一位得到高位部分积为 ,低位部分积为 。第二次计算,根据 ,得到 ,高位部分积为 补 ,低位部分积为 ,右移一位得到高位部分积为 ,低位部分积为 。第三次计算,根据 ,得到 ,高位部分积为 补 ,低位部分积为 ,右移一位得到高位部分积为 ,低位部分积为 。第四次计算,根据 ,得到 ,高位部分积为 ,低位部分积为 ,右移一位得到高位部分积为 ,低位部分积为 。 第五次计算,根据 ,得到 ,高位部分积为 ,低位部分积为 。最后一次计算,不再移位。
最后的结果是
,转换为原码为
乘法运算时需要 ACC 累加器与 MQ 乘商寄存器
补码除法
补码除法运算是将符号位与数值位一起参加运算,商符自然形成。
根据被除数和除数的符号决定是做加法还是减法。 上商的原则根据余数和除数的符号位共同决定,同号上商 1
,异或上商0
,最后一步商恒置1
。
补码除法运算使用加减交替法的规则如下:
符号位参加运算,除数与被除数均用补码表示,商和余数也用补码表示。 若被除数与除数同号,则被除数减去除数;若被除数与除数异号,则被除数加上除数。 若除数与除数同号,则商上 1
,余数左移一位减去除数;若余数与除数异号,则商上0
,余数左移一位加上除数。重复执行第3步操作 n
次。若对商的精度没有特殊要求,则一般采用 末位恒置 1
法。
符号扩展
计算机进行算术运算时,假设 8
位数与 16
位数相加时,在保留数字符号及数值的情况下,需为 8
位数增加到 16
位数的增加二进制数字位数操作,称为符号扩展。
正数的符号扩展只要将原有符号位移动到扩展后数字的符号位上,其余附加位填充 0
即可,如将 0000 0101
扩充至 16
位的结果是 0000 0000 0000 0101
。
负数的符号扩展方法会根据二进制表示形式的不同而不同。
负数的原码表示形式,在符号扩展时,只需要将符号位变为 1
,其余填充零即可,如1000 0101
扩充至16
位的结果是1000 0000 0000 0101
。反码在符号扩展时,是在原有形式的符号位移动到扩展后的符号位上,剩余附加位用 1
来填充,如1111 1010
,扩充至16
位的结果是1111 1111 1111 1010
。补码表示负数的符号扩展方法是将原有形式的符号位移动到扩充后的符号位上,对于整数而言,附加位用 1
填充,对于小数而言,附加位用0
填充,如1111 1011
,扩充至16
位的结果是1111 1111 1111 1011
。
运算溢出
溢出是指运算结果超过了数的表示范围。通常,称大于机器所能表示的最大正数为上溢,称小于机器所能表示的最小负数为下溢。
当计算产生的结果非常大时,才会产生溢出,如两正数相加,运算结果的符号位却为 1
,或两数相减,运算结果的符号位却为 0
。当运算出现溢出时,运算结果是错误的。
补码加减法运算判断溢出的方式有三种。
采用一位符号位,当两操作数符号位相同,结果却与原操作数符号不同,则表示结果溢出。 采用一位符号位,根据数据位的进位情况判断溢出。 采用双符号位,正数符号位为 00
,负数符号位为11
。当符号位为01
表示正溢出,为10
表示负溢出。
浮点数运算
浮点数是指以适当的形式将比例因子表示在数据中,让小数点的位置根据需要而浮动。这样,在位数有限的情况下,既扩大了数的表示范围,又保持了数的有效精度。通常,浮点数表示为
式中,r
称为基数或基值,可取 2、4、8 等,E
称为阶码,M
称为尾数,可见浮点数由阶码和尾数两部分组成,如下图所示。

阶码是整数,阶符 和阶码的位数 m
共同反映浮点数的表示范围及小数点的实际位置;数符 代表浮点数的符号;尾数的位数 n
反映浮点数的精度。
浮点数规格化
为了提高运算的精度,需要充分地利用尾数的有效数位,通常采取浮点数规格化形式,即规定尾数的最高数位必须是一个有效值。非规格化浮点数需要进行规格化操作才能变成规格化浮点数。所谓规格化操作,是指通过调整一个非规格化浮点数的尾数和阶码的大小,使非零的浮点数在尾数的最高数位上保证是一个有效值。
左规 当浮点数运算的结果为非规格化时要进行规格化处理,将尾数算术左移一位、阶码减 1(基数为 2 时)的方法称为左规,左规可能要进行多次。 右规 当浮点数运算的结果尾数出现溢出时,将尾数算术右移一位、阶码加 1
的方法称为右规。需要右规时,只需进行一次。
规格化浮点数的尾数 M
的绝对值应满足条件 。
若 r = 2
,则有 。规格化表示的尾数形式如下。
正数 x
的表示范围为 。尾数的表示范围为 。
负数 x
的表示范围为 。尾数的表示范围为 。
IEEE 754 标准
浮点数一般采用 IEEE 指定的国际标准,按照 IEEE 754 标准,如下图所示。

IEEE 754 标准规定常用的浮点数格式有短浮点数、长浮点数、临时浮点数,见下表。
| 类型 | 数符 | 阶码 | 尾数数值 | 总位数 | 偏置值 | |
| 十六进制 | 十进制 | |||||
| 短浮点数 | 1 | 8 | 23 | 32 | 7FH | 127 |
| 长浮点数 | 1 | 11 | 52 | 64 | 3FFH | 1023 |
| 临时浮点数 | 1 | 15 | 64 | 80 | 3FFFH | 16383 |
IEEE 754 标准的浮点数,是尾数用采取隐藏位策略的原码表示,且阶码用移码表示的浮点数。
以浮点数为例,最高位为数符位;其后是 8 位阶码,以 2 为底,用移码表示,阶码的偏置值为 ;其后 23 位是原码表示的尾数数值位。对于规格化的二进制浮点数,数值的最高位总是 1
,为了能使尾数多表示一位有效位,将这个 1
隐含,因此尾数数值实际上是 24 位。隐含的 1
是一位整数。在浮点格式中表示的 23 位尾数是纯小数。例如,,将它规格化后结果为 ,其中整数部分的 1
将不存储在 23 位尾数内。
短浮点数与长浮点数都采用隐含尾数最高数位的方法,故可多表示一位尾数。临时浮点数又称扩展精度浮点数,无隐含位。
阶码是以移码形式存储的。对于短浮点数,偏置值为 127;对于长浮点数,偏置值为 1023。存储浮点数阶码部分之前,偏置值要先加到阶码真值上。上例中,阶码值为 3,故在短浮点数中,移码表示的阶码为 127+3=130(82H);在长浮点数中,阶码为 1023+3=1026(402H)。
IEEE 754 标准中,规格化的浮点数的真值为
规格化长浮点数的真值为
式中,s=0
表示正数,x=1
表示负数;短浮点数 E
的取值为 1~254
(8位表示),M为 23
位,共 32
位,长浮点数 E
的取值为 1~2046
(11位表示),M为 52
位,共 64
位。IEEE 754 标准浮点数的范围如下所示。
| 格式 | 最小值 | 最大值 |
|---|---|---|
| 单精度 | E=1, M=0 | E=254, M=.111···, |
| 双精度 | E=1, M=0 | E=2046, M=.1111···, |
浮点数运算的特点是阶码运算和尾数运算分开进行。浮点数的加减运算一律采用补码。浮点数加减运算分为以下几步。
对阶
所谓对阶,是将两个操作数的小数点位置对齐,即使两数的阶码相等。为此,先求阶差,然后以小阶向大阶看齐的原则,使阶码小的尾数右移一位,阶加 1
,直到两个数的阶码相等为止。右移的次数正好等于阶差。尾数右移时,舍弃掉有效位会产生误差,影响精度。
尾数求和
将对阶后的尾数按定点数加减运算规则运算。
规格化
以双符号位为例,当尾数大于 0 时,其补码规格化形式为
当尾数小于 0
时,其补码规格化形式为
可见,当尾数的最高数值位与符号位不同时,即为规格化形式。规格化分为左规与右规两种。
左规:当尾数出现 00.0xx···x
或11.1xx···x
时,需左规,即尾数左移1
位,和的阶码减1
,直到尾数为00.1xx···x
或11.0x···x
。右规:当尾数求和结果溢出时,如尾数为 10.xx···x
或01.xx···x
,需右规,即尾数右移一位,和的阶码加1
。
舍入
在对阶和右规的过程中,可能会将尾数低位丢失,引起误差,影响精度。常见的舍入方法有:0
舍 1
入法和恒置 1
法。
0
舍 1
入法:类似于十进制数运算中的 四舍五入
法,即在尾数右移时,被移去的最高数值位为 0,则舍去;被移去的最高数值为为 1,则在位数的末位加 1。河阳做可能会使尾数又溢出,此时需再做一次右规。
恒置 1
法:尾数右移时,无论丢掉的最高数值位是 1
还是 0
,都使右移后的尾数末位恒置 1
。这种方法同样有使尾数变大和变小的两种可能。
溢出判断
与定点数加减法一样,浮点数加减运算最后一步也需判断溢出。
在浮点数规格化中已指出,当尾数之和或差中出现 01.xx···x
或 10.xx···x
时,并不表示溢出,只能将此数右规后,再根据阶码来判断浮点数运算结果是否溢出。
浮点数的溢出与否是由阶码的符号决定的。以双符号位补码为例,当阶码的符号位出现 01
时,即阶码大于最大阶码时,表示上溢,进入中断处理;当阶码的符号位出现 10
时,即阶码小于最小阶码时,表示下溢,按机器零处理。实际上原理还是阶码符号位不同表示溢出,且真实符号位和高位符号位一致。





