第二章
真值和机器数
真值:正负符号加二进制绝对值
机器数:正负号分别用0和1来代替,一般放在最高位
数的机器码表示:在远离小数点的位置补0
原码表示法
纯小数时
- 正数:本身数值
- 负数:本身数值加上符号位 0为正,1为负
纯整数时
- 正数:本身数值
- 负数:本身数值加上2的n-1次方(n为字长)
补码表示法
补码中1.0000000表示负1,补码的零只有一个
对于n位数来说,其模的大小为n位数全为1后再在最末位加1
如果某一数有n位整数(包括符号位),则它的模为2^n
如果是n位小数,它的模总是是2
- 纯小数时
- 正数:本身数值
- 负数:2-本身数值
- 纯整数时:
- 正数:本身数值
- 负数:2^n-本身数值
反码表示法
- 正数:本身数值
- 负数:本身数值按位取反
- +0反码:00000000
- -0反码:11111111
移码表示法
将补码符号位求反
数的定点表示
定点小数:用于尾数(表示数值)
定点整数:用于阶码(表示指数)
数的浮点表示法
浮点数的表示格式
- 阶码+尾数:其中阶码是定点整数,用补码表示;尾数是定点小数,用补码显示
- 尾数符+阶码+尾数值:其中阶码是定点整数,用移码表示;尾数值是定点小数,用补码表示
浮点数的规格化
可以提高数据的精度,—–>提高精度可以有两种方法
- 尾数位数增加
- 尾数规格化
所谓规格化就是调整阶码使其尾数满足如下形式:
- 原码规格化后:正数为0.1开头,负数为1.1开头
- 补码规格化后:正数为0.1开头,负数为1.0开头
浮点数规格化习题示例
某机器用32位表示一个数,阶码部分占8位(含一个符号位),尾数部分占24位(含一个符号位)
设x1=-256.5,x2=127/256,试写出x1和x2的两种浮点数表示格式:
1 | |
浮点数的表示范围(设阶码和尾数均为n位)
- 阶码表示范围
| ———— | 最小负数 | 最大负数 | 最小正数 | 最大正数 |
|---|---|---|---|---|
| 二进制补码 | 100…0(共n位,最小则全为0) | 111…1(共n位,首位的1代表负,最大则剩下的全补1) | 000…1(共n位,第一位0为符号位) | 011…1(共n位,第一位0为符号位) |
| 十进制真值 | 计算可得 | 计算可得 | 计算可得 | 计算可得 |
| 2. 规格化尾数表示范围(补码规格化后正数为0.1…形式,负数为1.0…形式) |
| ————— | 最小负数 | 最大负数 | 最小正数 | 最大正数 |
|---|---|---|---|---|
| 二进制补码 | 1.0….0 | 1.011..1 | 0.10…0 | 0.11…1 |
| 十进制真值 | 计算可得 | 计算可得 | 计算可得 | 计算可得 |
| 3. 规格化浮点数表示范围 |
| 最小负数 | 最大负数 | 最小正数 | 最大正数 |
|---|---|---|---|
| 尾数负最小*2^(正阶码最大) | 尾数负最大*2^(负阶码最小) | 尾数正最小*2^(负阶码最小) | 尾数正最大*2^(正阶码最大) |
非数值数据的表示
字符表示
ASCII码(美国信息交换标准码):
共有128个字符,即2^7,因此占据7位,最高位为0,而汉字编码最高位为1
所以可以根据最高位来区分是否为汉字编码
汉字的表示
区位码(不唯一)→十进制区位码→十六进制+2020H→国标码十六进制+8080H→机内码(唯一)
一个汉字用两个字节表示区内码
定点加减法运算
在计算机中,常将数值转化为补码后再进行加减运算,优点是可以将减法运算转化为加法运算
加减法运算规则:
- 补码运算
- 数值位和符号位一同参与运算
- 求差时,将减数求补,用求和代替求差
- 运算结果为补码,符号位0表示正数,符号位1表示负数
- 符号位的进位为模值,应该丢掉
加法运算:
[X]补+[Y]补=[X+Y]补
减法运算
[X]补-[Y]补=[X+(-Y)]补=[X]补+[-Y]补
因为[-Y]补+[Y]补=[0]补=0
所以[-Y]补=-[Y]补
所以只要能通过[Y]补求得[-Y]补,就可以将补码减法运算化为补码加法运算
已知[Y]补,求[-Y]补的法则是:
对[Y]补各位(包括符号位)求反,然后在末位加上1
例如:[Y]补=1.1010 ,则[-Y]补=0.0110
补充:
求负数的补码:把它的原码自低位向高位看去,遇到的第一个’1’及其右边的’0’都不变,将左边的所有位按位取反,符号位不变。
溢出判断法:
在运算结果超出机器所能表示的数值范围后,就会产生溢出。
溢出有两种判断的方法:双符号法和进位判断法
双符号法:
也叫做变形补码法,模4补码法
采用的方法是用两个相同的符号位表示一个数的符号,左边第一位为第一符号位,第二位为第二符号位
第一符号位始终表示真正的符号,如果计算结果超出模值,则丢掉
| 符号 | 表示 |
|---|---|
| 00 | 正数 |
| 01 | 正溢出 |
| 10 | 负溢出 |
| 11 | 负数 |
进位判断法:
当两个单符号位的补码进行加减运算时,若最高数值位向符号位的进位值C与符号位产生的进位输出值S相同则没有溢出发生,否则,有溢出发生
用异或的方式进行判断
基本的二进制加,减法器

加法的实现

- p=0
- 设$Y_{n-1}$=0,异或门输出为0;设$Y_{n-1}$为1,异或门输出为1。
- 总结:异或门输出=$Y_{n-1}$
- 加法:[X]补+[Y]补=[X+Y]补
减法的实现

- p=1
- 设$Y_{n-1}$=0,异或门输出为1;反之为0;
- 总结:异或门输出=$Y_{n-1}$取反
- 减法实现:[X]补-[Y]补=[X]补+[Y]补取反+$2 ^{-n}$ (n是小数点之后的位数,+$2 ^{-n}$的意思是在末尾+1)
- 末尾的加1来源于一开始的Cn,Cn=p=1 (设计巧妙)
定点乘法运算
原码一位乘法
乘法的本质:
将乘法变成加法和右移运算的结果
运算法则:
- 被乘数和乘数均取绝对值参加运算,符号位单独考虑
- 被乘数取双符号位,部分积的长度与被乘数的长度相同,初值为0
- 从乘数的最低位的$y_n$位开始对乘数进行判断:若$y_n$=1,则部分积加上被乘数|X|,然后右移一位;若$y_n$=0,则部分积加上0,然后右移一位
- 重复3的判断n次
例题:
之后符号位就是x,y的符号位进行异或运算为0,数值位就是|X|.|Y|=0.10001111
所以最后结果为0.10001111
补码一位乘法
运算规则:
- 符号位参与运算,运算的数均以补码表示
- 被乘数一般取双符号位参与运算,部分积初始值为0
- 看乘数小数点位数决定移多少次
- 乘数末位增设附加位$y_{n+1}$,且初值为0
- 按下表进行操作
| $y_n$(高位) | $y_{n+1}$(低位) | 操作 |
|---|---|---|
| 0 | 0 | 部分积右移一位 |
| 0 | 1 | 部分积加[x]补,右移一位 |
| 1 | 0 | 部分积加[-x]补,右移一位 |
| 1 | 1 | 部分积右移一位 |
例题:

补码两位乘法
减少运算步骤,提高运算速度
运算规则如下:
符号位参与运算,两数均以补码表示
部分积与被乘数均采用3位符号表示,乘数末位增加一位$y_{n+1}$,其初值为0
| $Y_{n-1}$ | $Y_n$ | $Y_{n+1}$ | 操作 |
|---|---|---|---|
| 0 | 0 | 0 | 加0,右移两位 |
| 0 | 0 | 1 | 加[x]补,右移两位 |
| 0 | 1 | 0 | 加[x]补,右移两位 |
| 0 | 1 | 1 | 加2[x]补,右移两位 |
| 1 | 0 | 0 | 加2[-x]补,右移两位 |
| 1 | 0 | 1 | 加[-x]补,右移两位 |
| 1 | 1 | 0 | 加[-x]补,右移两位 |
| 1 | 1 | 1 | 加0,右移两位 |
总结:
$Y_{n-1}$为0,代表正,即“+”,之后看1的个数决定加几个[x]补
$Y_{n-1}$为1,代表负,即“-”,之后看0的个数决定加几个[-x]补
若尾数n为偶数,则乘数用两位符号,最后一步不移位;
若尾数n为奇数,则乘数用一位符号,最后一步移一位
示例:
第一题:
第二题:
定点除法运算
补码一位除法
本质:加法和左移
三个规则:
- 比较上商规则:比较被除数与除数符号,余数和除数符号
- 商的校正规则
- 余数校正规则
补码不恢复余数法的算法规则;
- 符号位参加运算,除数与被除数均用双符号位补码表示
- 当被除数与除数同号时,用被除数减去除数;被除数与除数异号时,用被除数加上除数;商符号位的取值见3
- 当余数与除数同号时,商上1,余数左移一位减去除数;余数与除数异号时,商上0,余数左移一位加上除数
- 余数左移加上或减去除数后就得到了新余数
- 采用校正法包括符号位在内,规则3应重复n+1次
商的校正原则:
- 当刚好能除尽(即运算过程中任一步余数为0)时,
- 若除数为正,则商不必校正;
- 若除数为负,则商需要校正,即加$2^{-n}$进行修正
- 当不能除尽时,
- 若商为正,则不必校正;
- 若商为负,则商需要加$2^{-n}$校正
余数之所以要校正,是因为在补码不恢复余数除法运算过程中先比较后上商的缘故
余数的校正方法:
- 若商为正,则当余数与被除数异号时,应将余数加上除数进行校正才能获得正确的余数
- 若商为负,则当余数与被除数异号时,余数需要减去除数进行校正
商校正,能除尽,看除数;不能除尽,看商,正的不必校正
余数校正,看被除数,同号不校正;异号看商,正加,负减除数
思维导图示例:
习题示例: