二、数据的表示与运算
进制转换
二进制....八进制......
十六进制
一般用数字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\)
数的机器码表示
定点表示
计算机有两种表达小数的方法:
- 定点格式:小数点事先约定,位置固定
- 浮点格式:小数点按规则浮动,位置不固定
注意:两者都是隐含存储(实际存储中不存储小数点)。
定点小数
例如:(假设约定小数点位于符号位后面) +0.75D = 0.11B 存储为011 ;-0.75D = 1.11B 存储为111
表示范围:(假设约定小数点位于符号位后面)
有n位尾数的定点小数:\(-(1- 2^{−n}) ~ 1- 2^{−n}\)
定点整数
例如(未考虑位数扩展):+3D = 011.B 存储为011 ; -3D = 111.B 存储为111
表示范围
有n位尾数的定点整数:\(-(2^n -1 ) ~ 2^n -1\)
定点数特点
-
表示的数的范围受计算机字长的限制;
有符号数首位用于表示符号,因此和无符号数表示的范围不同 -
符号位被数字化 (正号:0 负号:1)
-
小数点处于约定的位置
定点数:小数点的位置固定不变。
浮点数: 小数点的位置允许浮动。
机器码分类:
一、无符号数
二、有符号数
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}\)
特点
-
有 正0 和 负0 之分,也就是说 \(+0 ≠-0\)
-
优点: 简单、直观
-
缺点: 用原码做加法时,会出现如下问题,需要根据符号位,进行分类运算。
反码表示法
主要作用: 快速计算补码。
定义:
- 正数:与原码相同
- 负数:符号位不变,数值位将原码的数值按位取反
取值范围:
整数:
纯小数:
特点:
-
电路容易实现反码。
-
反码表示有正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
-
\([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)
特点:
-
不区分+0和-0,都是\(0.0000..\)
-
-1.0000没有原码,只有补码1.0000
性质:
\([x-y]_补=[x]_补-[y]_补=[x]_补+[-y]_补\)
移码表示法
\([x]_移 =2^n + x(2^n ≥x≥-2^n)\)
移码通常用来表示浮点数的阶码。就是将小数部分,乘为整数。
特点:移码和补码尾数相同,符号位相反
真值、补码和移码的对照表
小结
最高位为符号位,书写上用“,”(整数)或“.”(小数)将数值部分和符号位隔开
对于正数,原码=补码=反码
对于负数,符号位为1, 其余数值部分
原码除符号位外每位取反末位加1 补码
原码除符号位外每位取反 反码
例 设机器数字长为8位(其中1位为符号位)对于整数,当其分别代表无符号数、原码、补码和反码时,对应的真值范围各为多少?
已知\([y]_补\)求 \([-y]_补\): 连同符号位在内,每位取反,末尾加1即可。
定点运算
数据表示格式
计算机常用的数据表示格式有两种:
- 定点格式:小数点事先约定,位置固定
- 浮点格式:小数点按规则浮动,位置不固定
注意:两者都是隐含存储(实际存储中不存储小数点)。
定点数表示法
所有数据的小数点提前约定,位置固定不变(理论上位置可以任意)。
通常表示两种数据:纯小数和纯整数。
习惯表示方法: 在符号位与数值位之间,整数用,
小数用.
例如:-58;数值取10位,符取1位
二进制:1 $,$111010,定点表示:1 \(,\)0000
111010
例如:\(\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]以定点整数为例,用数轴形式说明原码、反码、补码表示范围和可能的数码组合情况。
[例7]将十进制真值(-127,-1, 0,+1,+127)列表表示成二进制数及原码、反码、补码、移码值。
浮点数表示法
为什么要引入浮点数表示
- 有需要调节小数点的位置的实际应用常见
- 定点数的表示范围小,为了能表示两个大小相差很大的暑假,需要很长的机器字长;
- 定点数 数据存储单元的利用率往往很低;
浮点数的表示形式
浮点数分为 阶码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]_补\) 是规格化的数
浮点数数据范围
浮点数的数据范围如图:
其中
-
上溢 就是指 需要表示的数大于最大正数或者小于最小负数,
当出现上溢时,程序必须中断,否则就会带来错误结果。 -
下溢 就是指 需要表示的数小于零且大于最大负数 或者 大于零且小于最小正数,
当出现下溢时,程序只要将该数认为是0即可(即 机器零),没必要终止程序。
机器零
机器零就是指 可以让机器认为该数是0 的数。
有两种情况:
- 当浮点数尾数为0时,不论其阶码为何值 都按机器零处理
- 当浮点数阶码等于或小于它所表示的最小数时,不论尾数为何值,按机器零处理
⭐IEEE754标准浮点数
IEEE754标准浮点数是一个规范的浮点数表示规则,和上面的浮点数有区别,也有联系
和之前学习浮点数的区别是:
-
数符 移动到阶码前面
-
阶码 用移码表示(没有负数),没有 阶符
-
尾数 是规格化的数,且规格化为 \(1.M\) (\(1≤ 1.M≤2\))
-
尾数 隐藏表示最高位1(尾数是规格化后的数,最高位一定是1),也就是说:M=xx…x ,表示尾数=1.xx…x
IEEE754标准分为:32位浮点数(常用)和64位浮点数
规格化的短浮点数的真值为:\((−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位浮点数的具体表示方法:
-
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. 转换格式:将已知真值,转化为题目要求的浮点数
- 对阶
- 尾数求和
- 规格化
- 舍入
- 溢出判断
例: 已知十进制数X=−5/256、Y=+59/1024,按机器补码浮点运算规则计算X−Y,结果用二进制表示.
浮点数格式如下:阶符取2位,阶码取3位,数符取2位,尾数取9位
准备
按照题意将十进制数转化为浮点数。
- 转换格式:用补码表示阶码和尾数
\(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)求阶差
① 求阶差:\([Δ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]_补\) 只需要计算加法即可。
规格化
如果尾数溢出,就进行右归。
注意: 此时的溢出不一定发生浮点数溢出。
上面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)
汉字的表示和编码
字符串
字符串的存放,就是将字符进行按顺序存放,但是存放方法有两种:
- 大端模式:存储单元内先存储高位字节、后存储低位字节的顺序
- 小端模式:存储单元内先存储低位字节、后存储高位字节的顺序
比如:存放字符串:IF A>B_THEN_READ(C)
(每行代表一个存储单元,每个存储单元存放4B)
校验码(奇偶校验码)
引入原因:信息传输和处理过程中受到干扰和故障,容易出错跳变。但是无法判断出错。
方法:1.在有效信息中加入一些冗余信息(校验位)2.使码距不为1(百度吧)
校验码: 校验位+有效信息位。
、
奇校验码:整个校验码(有效信息位和校验位)中“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。
其它还有Hamming, CRC等,可以实现更多功能。