二、数据的表示与运算

进制转换

二进制....八进制......
十六进制
一般用数字0到9和字母A到F表示,其中:AF相当于十进制的1015

八进制和十六进制 主要目的: 简化二进制的书写

进制转化

二进制<->八进制
3位二进制数,对应1位八进制数

例如:
\((1001101.01)_2 =(115.2)_{8}\)
(整数部分向前补零,小数部分向后补零)

二进制<->十六进制
4位二进制数,对应1位八进制数

例如:
\((1001101.01)_2 =(4D.4)_{16}\)
(整数部分向前补零,小数部分向后补零)

十进制分数-> 二进制
分子分母先转化成二进制,然后分子二进制减去分母二进制即可
例:
\(\frac{19}{128}=\frac{2^4+2^1+2^0}{2^7}=2^{-3}+2^{-6}+2^{-7}=0.0010011\)

数的机器码表示

定点表示

计算机有两种表达小数的方法:

  • 定点格式:小数点事先约定,位置固定
  • 浮点格式:小数点按规则浮动,位置不固定

注意:两者都是隐含存储(实际存储中不存储小数点)。

定点小数
image

例如:(假设约定小数点位于符号位后面) +0.75D = 0.11B 存储为011 ;-0.75D = 1.11B 存储为111

表示范围:(假设约定小数点位于符号位后面)
有n位尾数的定点小数:\(-(1- 2^{−n}) ~ 1- 2^{−n}\)

定点整数
image

例如(未考虑位数扩展):+3D = 011.B 存储为011 ; -3D = 111.B 存储为111

表示范围
有n位尾数的定点整数:\(-(2^n -1 ) ~ 2^n -1\)

定点数特点

  1. 表示的数的范围受计算机字长的限制;
    有符号数首位用于表示符号,因此和无符号数表示的范围不同

  2. 符号位被数字化 (正号:0 负号:1)

  3. 小数点处于约定的位置
    定点数:小数点的位置固定不变。
    浮点数: 小数点的位置允许浮动。

机器码分类:
一、无符号数
二、有符号数
1.机器数与真值 2. 原码表示法 3. 补码表示法 4. 反码表示法 5. 移码表示

无符号数

定义:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值。

表示范围:\(n\) 位的无符号数表示范围为:\(0 ~ 2^{n}-1\)

有符号数

真值和机器数

真值: 带符号的数字
机器数:符号位被数字化的数(真值在计算机中的二进制表示形式。)
例如:真值+15 对应的机器码是0 1111;真值-8 对应的机器码是1 1000

注意: 真值和机器数的区别是 符号是否被数字化。和是几进制没有关系。
一般来说0表示正数,1表示负数

由于机器只能是0/1,因此必须引入 机器数,为了解决机器数带来的复杂的运算问题,引出了:原码,补码,反码,移码。

原码表示法

(和上面用的 机器数 相同)
定义: 最高位为数的符号位,其余位为数值位;符号位用0表示正数,用1表示负数。

整数

例如:(假设字长为8位(符号位+数值位),最高位为符号位)
X=+1001, \([X]_原\)=0,0000 1001
X=-1001, \([X]_原\)=1,0000 1001

原码整数的数据范围:有n位尾数 \(-(2^n -1)\)~$ +(2^n -1)$

小数
如果真值\(1>x≥0\)\([x]_{原} = x\)
如果真值\(0≥x>-1\)\([x]_{原} = 1-x\)

本质上还是符号用0表示正数,用1表示负数)

例如:(假设约定小数点位于符号位后面,假设字长为8位(符号位+数值位))
x=+0.1101 , \([X]_原\)=0.1101 0000
x=-0.1101 , \([X]_原\)=1-(-0.1101)=1.1101 0000

表示范围:(假设约定小数点位于符号位后面)有n位尾数的定点小数:\(-(1- 2^{−n}) ~ 1- 2^{−n}\)

特点

  1. 有 正0 和 负0 之分,也就是说 \(+0 ≠-0\)

  2. 优点: 简单、直观

  3. 缺点: 用原码做加法时,会出现如下问题,需要根据符号位,进行分类运算。
    image

反码表示法

主要作用: 快速计算补码。

定义:

  • 正数:与原码相同
  • 负数:符号位不变,数值位将原码的数值按位取反

取值范围:
整数:image

纯小数:image

特点:

  1. 电路容易实现反码。

  2. 反码表示有正0和负0之分
    \([+0]_反=00000000\)
    \([-0]_反=11111111\)

补码表示法

引入原因: 原码计算加法比较复杂,因此想找到一个方法,使做加法只需要做加法。

方法:
在模一个数的情况下,可以用与负数等价的正数来代替这个负数 就可使 减 -->加。

比如说:(在模数为12的情况下) -3等价于+9 记为\(-3 ≡ +9 (\mod 12)\)

经发现,在二进制下,模数就是 这个二进制数的位数取全零,然后在最高位拼接上1

例如:011 1001的模数就是1000 0000

因此

  • 正数:与原码相同:(+1 0000 0000 + 0000 1110) % +1 0000 0000=+0000 1110

  • 负数:符号位与原码相同,数值位由原码取反加1得到:(+ 1,00000000 - 00001110)%+ 1,00000000=+1111 0010
    image

  • \([y]_补 \to [-y]_补\) :连同符号位在内,每位取反,末尾加1。

数据范围:(若字长为n+1)

  • 对于整数,补码的表示范围为\(−2^n ≤ x ≤ 2^{n−1}\)(比原码多表示一个数\(−2^n\))。
    \([− 2^n]_补\) = 10,0000 − 1,0000 = 1,0000 (原码这个数指的是-0)

  • 对于纯小数,补码的表示范围为\(−1≤x≤1−2^{−n}\)(比原码多表示一个数−1)
    \([−1]_补\)=10.0000−1.0000= 1.0000(原码这个数指的是-0)

特点:

  1. 不区分+0和-0,都是\(0.0000..\)

  2. -1.0000没有原码,只有补码1.0000

性质:
\([x-y]_补=[x]_补-[y]_补=[x]_补+[-y]_补\)

移码表示法

image

\([x]_移 =2^n + x(2^n ≥x≥-2^n)\)

移码通常用来表示浮点数的阶码。就是将小数部分,乘为整数。
特点:移码和补码尾数相同,符号位相反

真值、补码和移码的对照表
image

小结

最高位为符号位,书写上用“,”(整数)或“.”(小数)将数值部分和符号位隔开

对于正数,原码=补码=反码

对于负数,符号位为1, 其余数值部分
原码除符号位外每位取反末位加1 补码
原码除符号位外每位取反 反码

例 设机器数字长为8位(其中1位为符号位)对于整数,当其分别代表无符号数、原码、补码和反码时,对应的真值范围各为多少?
image

已知\([y]_补\)\([-y]_补\): 连同符号位在内,每位取反,末尾加1即可。

定点运算

数据表示格式

计算机常用的数据表示格式有两种:

  • 定点格式:小数点事先约定,位置固定
  • 浮点格式:小数点按规则浮动,位置不固定

注意:两者都是隐含存储(实际存储中不存储小数点)。

定点数表示法

image

所有数据的小数点提前约定,位置固定不变(理论上位置可以任意)。

通常表示两种数据:纯小数和纯整数。

习惯表示方法: 在符号位与数值位之间,整数用,小数用.

例如:-58;数值取10位,符取1位
二进制:1 $,$111010,定点表示:1 \(,\)0000111010

例如:\(\frac{19}{128}\);数值取10位,符取1位
二进制:\(\frac{19}{128}=\frac{2^4+2^1+2^0}{2^7}=2^{-3}+2^{-6}+2^{-7}=0.0010011\)
定点表示:1 . 0010011000

数据范围

定点机 小数定点机 整数定点机
原码 \(-(1-2^{-n}) ~⏖ +(1-2^{-n})\) \(-(2^n − 1)~⏖ + (2^n − 1)\)
补码 \(-1~⏖+ (1-2^{-n})\) \(−2^n~⏖ + (2^n − 1)\)
反码 \(-(1-2^{-n})~⏖+ (1-2^{-n})\) \(-(2^n − 1)~⏖ + (2^n − 1)\)

[例6]以定点整数为例,用数轴形式说明原码、反码、补码表示范围和可能的数码组合情况。
image

[例7]将十进制真值(-127,-1, 0,+1,+127)列表表示成二进制数及原码、反码、补码、移码值。
image

浮点数表示法

为什么要引入浮点数表示

  • 有需要调节小数点的位置的实际应用常见
  • 定点数的表示范围小,为了能表示两个大小相差很大的暑假,需要很长的机器字长;
  • 定点数 数据存储单元的利用率往往很低;

浮点数的表示形式

image

浮点数分为 阶码E和尾码M 两部分,浮点数真值\(N=r^E×M\)(r为阶码的底,通常为2)

  • 阶码E 反映浮点数的表示范围及小数点的实际位置,也在一定程度上影响 精度,分为两部分:
    阶符:阶码正负性(不是浮点数的正负性)
    阶值:阶值的数值部分

  • 尾码M 和阶码一起决定表示精度,也分为两部分:
    数符:浮点数的符号(正负性)
    尾数:尾数数值部分

例:阶码、尾数均用补码表示,求a、b的真值
a = 0,01;1.1001
b = 0,01;0.0100
a: 阶码0,01对应真值+1,尾数1.1001对应真值\(-0.0111 = - (2^{−2}+ 2^{−3} + 2^{−4})\)或者理解为-111右移4位:\(- \frac{7}{2^4} = - \frac{7}{16}\)
所以a = $2^1 × (−0.0111) = 2^1 × (- \frac{7}{16}) = -\frac{7}{8} $
b: 阶码0,01对应真值+1,尾数0.01001对应真值+0.01001 =+1001右移5位: \(+\frac{9}{2^5}=+\frac{9}{32}\)
所以b = \(21 × (+0.01001) = 2^1 × (+ \frac{9}{32}) = +\frac{9}{16}\)

规格化

存储上面例子中的浮点数b,显然需要9b的空间,但是
\(b = 2^1 × (+0.01001)= 2^2 × (+0.10010)\)
可以将b变成:0,10;0.1001,两个数在数值上等价,但是占用的空间更少。这个操作就称为 规格化

规格化目的: 充分利用尾数有效位 (其他还有:保证表示唯一,提高运算精度)。

定义:规定尾数的最高数位必须是一个有效值 。

规格化的方法有两种:

  • 左规:当浮点数运算的结果为非规格化时要进行规格化处理,
    将尾数左移一位,阶码减1(基数为2时)。

  • 右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10)时,
    将尾数右移一位,阶码加1(基数为2时)

右规 例:a = 010;00.1100,b = 010;00.1000,求a+b
\(a = 2^2 × 00.1100 ,b = 2^2 × 00.1000\)
\(a+b = 2^2 × 00.1100 + 2^2 × 00.1000\)
\(= 2^2 × 01.0100\)(溢出了,需要右归)
\(= 2^3 × 00.1010\)

特点:

  • 规格化浮点数的尾数M的绝对值应满足:\(\frac{1}{r}≤|M|<1\)
    当r=2 时 \(\frac{1}{2}≤|S|<1\)

  • 由于左归的原因是:尾数左边无效位太多,因此:左归可多位

  • 由于右归的原因是:尾数运算溢出是要进行右归,因此:右归最多一位

规格化数的判断

S>0 规格化形式 S<0 规格化形式
真值 0.1xxxx 真值 -0.1xxxx
原码 0.1xxxx 原码 1.1xxxx
补码 0.1xxxx 补码 1.0xxxx
反码 0.1xxxx 反码 1.0xxxx

特征:

  • 补码:符号位和第一位数不同
  • 原码:符号位正常,第一位数都是1

特例
\([- \frac{1}{2}]_补\) 不是规格化的数
\([- 1]_补\) 规格化的数

浮点数数据范围

浮点数的数据范围如图:
image

其中

  • 上溢 就是指 需要表示的数大于最大正数或者小于最小负数,
    当出现上溢时,程序必须中断,否则就会带来错误结果。

  • 下溢 就是指 需要表示的数小于零且大于最大负数 或者 大于零且小于最小正数,
    当出现下溢时,程序只要将该数认为是0即可(即 机器零),没必要终止程序。

机器零

机器零就是指 可以让机器认为该数是0 的数。
有两种情况:

  • 当浮点数尾数为0时,不论其阶码为何值 都按机器零处理
  • 当浮点数阶码等于或小于它所表示的最小数时,不论尾数为何值,按机器零处理

⭐IEEE754标准浮点数

IEEE754标准浮点数是一个规范的浮点数表示规则,和上面的浮点数有区别,也有联系
image
和之前学习浮点数的区别是:

  • 数符 移动到阶码前面

  • 阶码 用移码表示(没有负数),没有 阶符

  • 尾数 是规格化的数,且规格化为 \(1.M\) (\(1≤ 1.M≤2\))

  • 尾数 隐藏表示最高位1(尾数是规格化后的数,最高位一定是1),也就是说:M=xx…x ,表示尾数=1.xx…x

IEEE754标准分为:32位浮点数(常用)和64位浮点数

image
规格化的短浮点数的真值为:\((−1)^s×1.M×2^{E−127}\)
规格化长浮点数的真值为:\((−1)^s×1.M×2^{E−1023}\)

数据范围:

格式 规格化的最小绝对值 规格化的最大绝对值
单精度 E=1,M=0:\(1.0×2^{1−127}=2^{−126}\) E=254,M=.11…1:\(1.11…1×2^{254−127}=2^{127}×(2−2^{−23})\)
双精度 E=1,M=0:\(1.0×2^{1−1023}=2^{−1022}\) E=2046,M=.11…1:\(1.11…1×2^{2046−1023}=2^{1023}×(2−2^{−52})\)

32位浮点数的具体表示方法:
image

  • S:符号位,1位,在最高位,“0”表示正数,“1”表示负数。

  • E:阶码,8位,采用移码表示,偏移值是127。移码比较大小方便。
    \(E=e+127\),具体来说就是:\(阶码E=浮点数的指数真值e+127\);然后补(省略)到8位即可。

  • M:尾数, 23位,均为在低位部分,采用纯小数表示

  • 基数R=2,基数固定,采用隐含方式来表示它。

IEEE754标准的一些规定:(以32位 短浮点数 为例)

  • 当阶码E全为0,尾数M全为0时,表示真值±0

  • 当阶码E全为0,尾数M不全为0时,表示非规格化小数\(±(0.xx…x)_2×2^{-126}\)

  • 当阶码E全为1,尾数M全为0时,表示无穷大±∞

  • 当阶码E全为1,尾数M不全为0时,表示非数值“NaN” (Not a Number)

例子:用 IEEE 32 位浮点格式表示如下的数:-5
符号位:S=1
-5=101
规格化:\(101=1.01×2^2\)
阶码:E=2+127=129=10000001
尾数:010000...
因此整体就是
1 10000001 010000...

浮点数的加减运算

浮点数的加减运算运算步骤
0. 转换格式:将已知真值,转化为题目要求的浮点数

  1. 对阶
  2. 尾数求和
  3. 规格化
  4. 舍入
  5. 溢出判断

例: 已知十进制数X=−5/256、Y=+59/1024,按机器补码浮点运算规则计算X−Y,结果用二进制表示.
浮点数格式如下:阶符取2位,阶码取3位,数符取2位,尾数取9位

准备

按照题意将十进制数转化为浮点数。

  1. 转换格式:用补码表示阶码和尾数
    \(5D = 101B,1/256 = 2^{-8}\)
    \(\to X = - 101 × 2^{-8} = - 0.101 × 2^{-5} = - 0.101 × 2^{−101}\)
    \(59D = 111011B,1/1024 = 2^{−10}\)
    \(\to Y = + 111011 × 2^{−10} = + 0.111011 × 2^{−4} = + 0.111011 × 2^{−100}\)
    X:11011,11.011000000 Y:11100,00.111011000

对阶:

对阶就是 使两个数的阶码相等。
方法是:小阶向大阶看齐,尾数毎右移一位,阶码加1。

(1)求阶差
image

① 求阶差:\([ΔE]_补\)=11011+00100=11111,知ΔE=−1

(2)对阶

对阶原则 小阶向大阶看齐(小阶变大,小阶尾数右移)阶差为2,小阶右移两位阶差为1,小阶右移1位

② 对阶:X:11011,11.011000000
\(\to\) 11100,11. 101100000 (\(X = - 0.0101 × 2^{−100}\))

注意:

  • 补码且负数时:尾数右移时,补1
  • 补码且正数时:尾数右移时,补0

尾数求和

直接尾数求和即可。
注意:
x-y不容易计算,一般时转化成补码计算,
因为:\([x-y]_补=[x]_补-[y]_补=[x]_补+[-y]_补\) 只需要计算加法即可。

image

规格化

如果尾数溢出,就进行右归。

注意: 此时的溢出不一定发生浮点数溢出。

上面x-y很明显发生了溢出
\(X-Y:11100, 10.110001000 \to 11101,11.011000100\)

舍入

在右规(对阶和规格化)过程中,尾数最低位的舍弃可能会引起误差,需考虑舍入处理:

  • “0”舍“1”入法:类似于十进制数运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样做可能会使尾数又溢出,此时需再做一次右规。
  • 恒置“1”法:尾数右移时,不论丢掉的最高数值位是“1”还是“0”,都使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。

如果采用0舍1入法,则本次计算 无舍入

溢出判断

判断是不是常阶码,从而判断有无溢出。

常阶码,无溢出,结果真值为\(2^{−3}×(−0.1001111)_2\)

字符和字符串

现在计算机不仅处理数值领域的问题,而且处理大量非数值领域的问题。比如人机交换信息时使用英文字母,标点符号等。上述信息必须编写成二进制格式的代码。

符号数据: 字符信息用数据表示,如ASCII等。

ASCII码

ASCII码是英文中经典的字符编码方式,用来表示 数字+英文字母+符号。

表示方式:
用一个字节来表示,低7位用来编码(128个),最高位为校验位。

其中:数字,大写字母,小写字母内部都是连续的,但是之间不连续。

  • 数字:48(0011 0000)~57(0011 1001
  • 大写字母:65(0100 0001)~90(0101 1010)
  • 小写字母:97(0110 0001)~122(0111 1010)

汉字的表示和编码

image

字符串

字符串的存放,就是将字符进行按顺序存放,但是存放方法有两种:

  • 大端模式:存储单元内先存储高位字节、后存储低位字节的顺序
  • 小端模式:存储单元内先存储低位字节、后存储高位字节的顺序

比如:存放字符串:IF A>B_THEN_READ(C) (每行代表一个存储单元,每个存储单元存放4B)
image

校验码(奇偶校验码)

引入原因:信息传输和处理过程中受到干扰和故障,容易出错跳变。但是无法判断出错。
方法:1.在有效信息中加入一些冗余信息(校验位)2.使码距不为1(百度吧)

校验码: 校验位+有效信息位。
image

奇校验码:整个校验码(有效信息位和校验位)中“1”的个数为奇数。
偶校验码:整个校验码(有效信息位和校验位)中“1”的个数为偶数

特点:

  • 只能检查出奇数个 位出错。
  • 仅需1位检验位。(再增加也无用:再对增加校验码后的数据,嵌套校验,会发现无效(本质是码距没有改变)
  • 不能纠正错误。

具体实现

\(x=(x_0x_1…x_{n-1})\)是一个n位数字,
则奇校验位C定义为:$C=x_0⊕x_1⊕…⊕x_{n-1} $ ⊕代表按位加

  • 当x中包含有奇数个1时,使C=1,否则C=0。
  • 同理偶校验为 偶数个1时,才使C=0,否则C=1。

image

其它还有Hamming, CRC等,可以实现更多功能。

posted @ 2022-09-15 10:31  kingwzun  阅读(285)  评论(0编辑  收藏  举报