第二章

真值和机器数

真值:正负符号加二进制绝对值

机器数:正负号分别用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

移码表示法

将补码符号位求反

数的定点表示

定点小数:用于尾数(表示数值)
定点整数:用于阶码(表示指数)

数的浮点表示法

浮点数的表示格式

  • 阶码+尾数:其中阶码是定点整数,用补码表示;尾数是定点小数,用补码显示
  • 尾数符+阶码+尾数值:其中阶码是定点整数,用移码表示;尾数值是定点小数,用补码表示

浮点数的规格化

可以提高数据的精度,—–>提高精度可以有两种方法

  1. 尾数位数增加
  2. 尾数规格化

    所谓规格化就是调整阶码使其尾数满足如下形式:
  • 原码规格化后:正数为0.1开头,负数为1.1开头
  • 补码规格化后:正数为0.1开头,负数为1.0开头

浮点数规格化习题示例

某机器用32位表示一个数,阶码部分占8位(含一个符号位),尾数部分占24位(含一个符号位)
设x1=-256.5,x2=127/256,试写出x1和x2的两种浮点数表示格式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
首先分析x1
x1真值为-256.5
写成原码就是二进制真值就是-(100000000.1
因为规格化后要满足:正数为0.1开头,负数为1.0开头
所以可以写成-2^9*0.1000000001,也就是2^9*1.1000000001(接下来取补码后成为1.0开头)
先计算阶码:
阶码的原码为9
所以阶码的补码为:1001,占8位,所以在远离小数点的地方补0,最后可得00001001
移码为补码的符号位取反,所以移码为10001001
接着计算尾数:
尾数的补码为:1.01111111110000000000000
接着组合写成格式即可

再来分析x2
x2=127/256可以写成1111111*2^(-8)=0.1111111*2^(-1)
阶码的补码为:-1的补码=11111111
阶码的移码为:01111111
尾数为:0.11111110000000000000000
组合即可

浮点数的表示范围(设阶码和尾数均为n位)

  1. 阶码表示范围
———— 最小负数 最大负数 最小正数 最大正数
二进制补码 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→机内码(唯一)
一个汉字用两个字节表示区内码

定点加减法运算

在计算机中,常将数值转化为补码后再进行加减运算,优点是可以将减法运算转化为加法运算

加减法运算规则:

  1. 补码运算
  2. 数值位和符号位一同参与运算
  3. 求差时,将减数求补,用求和代替求差
  4. 运算结果为补码,符号位0表示正数,符号位1表示负数
  5. 符号位的进位为模值,应该丢掉

加法运算:

[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相同则没有溢出发生,否则,有溢出发生

用异或的方式进行判断

基本的二进制加,减法器

基本的加减法器

  1. 加法的实现

    实现的图片

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

    实现的图片

    1. p=1
    2. 设$Y_{n-1}$=0,异或门输出为1;反之为0;
    3. 总结:异或门输出=$Y_{n-1}$取反
    4. 减法实现:[X]补-[Y]补=[X]补+[Y]补取反+$2 ^{-n}$ (n是小数点之后的位数,+$2 ^{-n}$的意思是在末尾+1)
    5. 末尾的加1来源于一开始的Cn,Cn=p=1 (设计巧妙)

定点乘法运算

原码一位乘法

乘法的本质:

将乘法变成加法和右移运算的结果

运算法则:

  1. 被乘数和乘数均取绝对值参加运算,符号位单独考虑
  2. 被乘数取双符号位,部分积的长度与被乘数的长度相同,初值为0
  3. 从乘数的最低位的$y_n$位开始对乘数进行判断:若$y_n$=1,则部分积加上被乘数|X|,然后右移一位;若$y_n$=0,则部分积加上0,然后右移一位
  4. 重复3的判断n次

例题:

原码一位乘法

之后符号位就是x,y的符号位进行异或运算为0,数值位就是|X|.|Y|=0.10001111
所以最后结果为0.10001111

补码一位乘法

运算规则:

  1. 符号位参与运算,运算的数均以补码表示
  2. 被乘数一般取双符号位参与运算,部分积初始值为0
  3. 看乘数小数点位数决定移多少次
  4. 乘数末位增设附加位$y_{n+1}$,且初值为0
  5. 按下表进行操作
$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为奇数,则乘数用一位符号,最后一步移一位

示例:
第一题:
第二章\补码两位乘法1.jpg
第二题:
第二章\补码两位乘法2.jpg

定点除法运算

补码一位除法

本质:加法和左移

三个规则:

  • 比较上商规则:比较被除数与除数符号,余数和除数符号
  • 商的校正规则
  • 余数校正规则
    补码不恢复余数法的算法规则;
  1. 符号位参加运算,除数与被除数均用双符号位补码表示
  2. 当被除数与除数同号时,用被除数减去除数;被除数与除数异号时,用被除数加上除数;商符号位的取值见3
  3. 当余数与除数同号时,商上1,余数左移一位减去除数;余数与除数异号时,商上0,余数左移一位加上除数
  4. 余数左移加上或减去除数后就得到了新余数
  5. 采用校正法包括符号位在内,规则3应重复n+1次

商的校正原则:

  1. 当刚好能除尽(即运算过程中任一步余数为0)时,
  • 若除数为正,则商不必校正;
  • 若除数为负,则商需要校正,即加$2^{-n}$进行修正
  1. 当不能除尽时,
  • 若商为正,则不必校正;
  • 若商为负,则商需要加$2^{-n}$校正

余数之所以要校正,是因为在补码不恢复余数除法运算过程中先比较后上商的缘故

余数的校正方法:

  • 若商为正,则当余数与被除数异号时,应将余数加上除数进行校正才能获得正确的余数
  • 若商为负,则当余数与被除数异号时,余数需要减去除数进行校正

商校正,能除尽,看除数;不能除尽,看商,正的不必校正
余数校正,看被除数,同号不校正;异号看商,正加,负减除数
思维导图示例:
补码一位除法思维导图
习题示例:
补码除法习题


第二章
https://shanhainanhua.github.io/2019/09/09/第二章/
作者
wantong
发布于
2019年9月9日
许可协议