二、数据的表示与运算
进制转换
二进制....八进制......
十六进制
一般用数字0到9和字母A到F表示,其中:AF相当于十进制的1015
八进制和十六进制 主要目的: 简化二进制的书写
进制转化
二进制<->八进制
3位二进制数,对应1位八进制数
例如:
(整数部分向前补零,小数部分向后补零)
二进制<->十六进制
4位二进制数,对应1位八进制数
例如:
(整数部分向前补零,小数部分向后补零)
十进制分数-> 二进制
分子分母先转化成二进制,然后分子二进制减去分母二进制即可
例:
数的机器码表示
定点表示
计算机有两种表达小数的方法:
- 定点格式:小数点事先约定,位置固定
- 浮点格式:小数点按规则浮动,位置不固定
注意:两者都是隐含存储(实际存储中不存储小数点)。
定点小数
例如:(假设约定小数点位于符号位后面) +0.75D = 0.11B 存储为011 ;-0.75D = 1.11B 存储为111
表示范围:(假设约定小数点位于符号位后面)
有n位尾数的定点小数:
定点整数
例如(未考虑位数扩展):+3D = 011.B 存储为011 ; -3D = 111.B 存储为111
表示范围
有n位尾数的定点整数:
定点数特点
-
表示的数的范围受计算机字长的限制;
有符号数首位用于表示符号,因此和无符号数表示的范围不同 -
符号位被数字化 (正号:0 负号:1)
-
小数点处于约定的位置
定点数:小数点的位置固定不变。
浮点数: 小数点的位置允许浮动。
机器码分类:
一、无符号数
二、有符号数
1.机器数与真值 2. 原码表示法 3. 补码表示法 4. 反码表示法 5. 移码表示
无符号数
定义:整个机器字长的全部二进制位均为数值位,没有符号位,相当于数的绝对值。
表示范围: 位的无符号数表示范围为:
有符号数
真值和机器数
真值: 带符号的数字
机器数:符号位被数字化的数(真值在计算机中的二进制表示形式。)
例如:真值+15 对应的机器码是0 1111;真值-8 对应的机器码是1 1000
注意: 真值和机器数的区别是 符号是否被数字化。和是几进制没有关系。
一般来说0表示正数,1表示负数
由于机器只能是0/1,因此必须引入 机器数,为了解决机器数带来的复杂的运算问题,引出了:原码,补码,反码,移码。
原码表示法
(和上面用的 机器数 相同)
定义: 最高位为数的符号位,其余位为数值位;符号位用0表示正数,用1表示负数。
整数
例如:(假设字长为8位(符号位+数值位),最高位为符号位)
X=+1001, =0,0000 1001
X=-1001, =1,0000 1001
原码整数的数据范围:有n位尾数 ~
小数
如果真值:
如果真值:
(本质上还是符号用0表示正数,用1表示负数)
例如:(假设约定小数点位于符号位后面,假设字长为8位(符号位+数值位))
x=+0.1101 , =0.1101 0000
x=-0.1101 , =1-(-0.1101)=1.1101 0000
表示范围:(假设约定小数点位于符号位后面)有n位尾数的定点小数:
特点
-
有 正0 和 负0 之分,也就是说
-
优点: 简单、直观
-
缺点: 用原码做加法时,会出现如下问题,需要根据符号位,进行分类运算。
反码表示法
主要作用: 快速计算补码。
定义:
- 正数:与原码相同
- 负数:符号位不变,数值位将原码的数值按位取反
取值范围:
整数:
纯小数:
特点:
-
电路容易实现反码。
-
反码表示有正0和负0之分
补码表示法
引入原因: 原码计算加法比较复杂,因此想找到一个方法,使做加法只需要做加法。
方法:
在模一个数的情况下,可以用与负数等价的正数来代替这个负数 就可使 减 -->加。
比如说:(在模数为12的情况下) -3等价于+9 记为
经发现,在二进制下,模数就是 这个二进制数的位数取全零,然后在最高位拼接上1
例如:011 1001的模数就是1000 0000
因此
-
正数:与原码相同:(+1 0000 0000 + 0000 1110) % +1 0000 0000=+0000 1110
-
负数:符号位与原码相同,数值位由原码取反加1得到:(+ 1,00000000 - 00001110)%+ 1,00000000=+1111 0010
-
:连同符号位在内,每位取反,末尾加1。
数据范围:(若字长为n+1)
-
对于整数,补码的表示范围为(比原码多表示一个数)。
= 10,0000 − 1,0000 = 1,0000 (原码这个数指的是-0) -
对于纯小数,补码的表示范围为(比原码多表示一个数−1)
=10.0000−1.0000= 1.0000(原码这个数指的是-0)
特点:
-
不区分+0和-0,都是
-
-1.0000没有原码,只有补码1.0000
性质:
移码表示法
移码通常用来表示浮点数的阶码。就是将小数部分,乘为整数。
特点:移码和补码尾数相同,符号位相反
真值、补码和移码的对照表
小结
最高位为符号位,书写上用“,”(整数)或“.”(小数)将数值部分和符号位隔开
对于正数,原码=补码=反码
对于负数,符号位为1, 其余数值部分
原码除符号位外每位取反末位加1 补码
原码除符号位外每位取反 反码
例 设机器数字长为8位(其中1位为符号位)对于整数,当其分别代表无符号数、原码、补码和反码时,对应的真值范围各为多少?
已知求 : 连同符号位在内,每位取反,末尾加1即可。
定点运算
数据表示格式
计算机常用的数据表示格式有两种:
- 定点格式:小数点事先约定,位置固定
- 浮点格式:小数点按规则浮动,位置不固定
注意:两者都是隐含存储(实际存储中不存储小数点)。
定点数表示法
所有数据的小数点提前约定,位置固定不变(理论上位置可以任意)。
通常表示两种数据:纯小数和纯整数。
习惯表示方法: 在符号位与数值位之间,整数用,
小数用.
例如:-58;数值取10位,符取1位
二进制:1 111010,定点表示:10000
111010
例如:;数值取10位,符取1位
二进制:
定点表示:1 . 0010011000
数据范围
定点机 | 小数定点机 | 整数定点机 |
---|---|---|
原码 | ||
补码 | ||
反码 |
[例6]以定点整数为例,用数轴形式说明原码、反码、补码表示范围和可能的数码组合情况。
[例7]将十进制真值(-127,-1, 0,+1,+127)列表表示成二进制数及原码、反码、补码、移码值。
浮点数表示法
为什么要引入浮点数表示
- 有需要调节小数点的位置的实际应用常见
- 定点数的表示范围小,为了能表示两个大小相差很大的暑假,需要很长的机器字长;
- 定点数 数据存储单元的利用率往往很低;
浮点数的表示形式
浮点数分为 阶码E和尾码M 两部分,浮点数真值(r为阶码的底,通常为2)
-
阶码E 反映浮点数的表示范围及小数点的实际位置,也在一定程度上影响 精度,分为两部分:
阶符:阶码正负性(不是浮点数的正负性)
阶值:阶值的数值部分 -
尾码M 和阶码一起决定表示精度,也分为两部分:
数符:浮点数的符号(正负性)
尾数:尾数数值部分
例:阶码、尾数均用补码表示,求a、b的真值
a = 0,01;1.1001
b = 0,01;0.0100
a: 阶码0,01对应真值+1,尾数1.1001对应真值或者理解为-111右移4位:
所以a =
b: 阶码0,01对应真值+1,尾数0.01001对应真值+0.01001 =+1001右移5位:
所以b =
规格化
存储上面例子中的浮点数b,显然需要9b的空间,但是
可以将b变成:0,10;0.1001,两个数在数值上等价,但是占用的空间更少。这个操作就称为 规格化。
规格化目的: 充分利用尾数有效位 (其他还有:保证表示唯一,提高运算精度)。
定义:规定尾数的最高数位必须是一个有效值 。
规格化的方法有两种:
-
左规:当浮点数运算的结果为非规格化时要进行规格化处理,
将尾数左移一位,阶码减1(基数为2时)。 -
右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10)时,
将尾数右移一位,阶码加1(基数为2时)
右规 例:a = 010;00.1100,b = 010;00.1000,求a+b
(溢出了,需要右归)
特点:
-
规格化浮点数的尾数M的绝对值应满足:
当r=2 时 -
由于左归的原因是:尾数左边无效位太多,因此:左归可多位
-
由于右归的原因是:尾数运算溢出是要进行右归,因此:右归最多一位
规格化数的判断
S>0 | 规格化形式 | S<0 | 规格化形式 |
---|---|---|---|
真值 | 0.1xxxx | 真值 | -0.1xxxx |
原码 | 0.1xxxx | 原码 | 1.1xxxx |
补码 | 0.1xxxx | 补码 | 1.0xxxx |
反码 | 0.1xxxx | 反码 | 1.0xxxx |
特征:
- 补码:符号位和第一位数不同
- 原码:符号位正常,第一位数都是1
特例
不是规格化的数
是规格化的数
浮点数数据范围
浮点数的数据范围如图:
其中
-
上溢 就是指 需要表示的数大于最大正数或者小于最小负数,
当出现上溢时,程序必须中断,否则就会带来错误结果。 -
下溢 就是指 需要表示的数小于零且大于最大负数 或者 大于零且小于最小正数,
当出现下溢时,程序只要将该数认为是0即可(即 机器零),没必要终止程序。
机器零
机器零就是指 可以让机器认为该数是0 的数。
有两种情况:
- 当浮点数尾数为0时,不论其阶码为何值 都按机器零处理
- 当浮点数阶码等于或小于它所表示的最小数时,不论尾数为何值,按机器零处理
⭐IEEE754标准浮点数
IEEE754标准浮点数是一个规范的浮点数表示规则,和上面的浮点数有区别,也有联系
和之前学习浮点数的区别是:
-
数符 移动到阶码前面
-
阶码 用移码表示(没有负数),没有 阶符
-
尾数 是规格化的数,且规格化为 ()
-
尾数 隐藏表示最高位1(尾数是规格化后的数,最高位一定是1),也就是说:M=xx…x ,表示尾数=1.xx…x
IEEE754标准分为:32位浮点数(常用)和64位浮点数
规格化的短浮点数的真值为:
规格化长浮点数的真值为:
数据范围:
格式 | 规格化的最小绝对值 | 规格化的最大绝对值 |
---|---|---|
单精度 | E=1,M=0: | E=254,M=.11…1: |
双精度 | E=1,M=0: | E=2046,M=.11…1: |
32位浮点数的具体表示方法:
-
S:符号位,1位,在最高位,“0”表示正数,“1”表示负数。
-
E:阶码,8位,采用移码表示,偏移值是127。移码比较大小方便。
即,具体来说就是:;然后补(省略)到8位即可。 -
M:尾数, 23位,均为在低位部分,采用纯小数表示
-
基数R=2,基数固定,采用隐含方式来表示它。
IEEE754标准的一些规定:(以32位 短浮点数 为例)
-
当阶码E全为0,尾数M全为0时,表示真值±0
-
当阶码E全为0,尾数M不全为0时,表示非规格化小数
-
当阶码E全为1,尾数M全为0时,表示无穷大±∞
-
当阶码E全为1,尾数M不全为0时,表示非数值“NaN” (Not a Number)
例子:用 IEEE 32 位浮点格式表示如下的数:-5
符号位:S=1
-5=101
规格化:
阶码:E=2+127=129=10000001
尾数:010000...
因此整体就是
1 10000001 010000...
浮点数的加减运算
浮点数的加减运算运算步骤
0. 转换格式:将已知真值,转化为题目要求的浮点数
- 对阶
- 尾数求和
- 规格化
- 舍入
- 溢出判断
例: 已知十进制数X=−5/256、Y=+59/1024,按机器补码浮点运算规则计算X−Y,结果用二进制表示.
浮点数格式如下:阶符取2位,阶码取3位,数符取2位,尾数取9位
准备
按照题意将十进制数转化为浮点数。
- 转换格式:用补码表示阶码和尾数
X:11011,11.011000000 Y:11100,00.111011000
对阶:
对阶就是 使两个数的阶码相等。
方法是:小阶向大阶看齐,尾数毎右移一位,阶码加1。
(1)求阶差
① 求阶差:=11011+00100=11111,知ΔE=−1
(2)对阶
对阶原则 小阶向大阶看齐(小阶变大,小阶尾数右移)阶差为2,小阶右移两位
,阶差为1,小阶右移1位
② 对阶:X:11011,11.011000000
11100,11. 101100000 ()
注意:
- 补码且负数时:尾数右移时,补1
- 补码且正数时:尾数右移时,补0
尾数求和
直接尾数求和即可。
注意:
x-y不容易计算,一般时转化成补码计算,
因为: 只需要计算加法即可。
规格化
如果尾数溢出,就进行右归。
注意: 此时的溢出不一定发生浮点数溢出。
上面x-y很明显发生了溢出
舍入
在右规(对阶和规格化)过程中,尾数最低位的舍弃可能会引起误差,需考虑舍入处理:
- “0”舍“1”入法:类似于十进制数运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样做可能会使尾数又溢出,此时需再做一次右规。
- 恒置“1”法:尾数右移时,不论丢掉的最高数值位是“1”还是“0”,都使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。
如果采用0舍1入法,则本次计算 无舍入
溢出判断
判断是不是常阶码,从而判断有无溢出。
常阶码,无溢出,结果真值为
字符和字符串
现在计算机不仅处理数值领域的问题,而且处理大量非数值领域的问题。比如人机交换信息时使用英文字母,标点符号等。上述信息必须编写成二进制格式的代码。
符号数据: 字符信息用数据表示,如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位检验位。(再增加也无用:再对增加校验码后的数据,嵌套校验,会发现无效(本质是码距没有改变))
- 不能纠正错误。
具体实现
设是一个n位数字,
则奇校验位C定义为: ⊕代表按位加
- 当x中包含有奇数个1时,使C=1,否则C=0。
- 同理偶校验为 偶数个1时,才使C=0,否则C=1。
其它还有Hamming, CRC等,可以实现更多功能。
本文作者:kingwzun
本文链接:https://www.cnblogs.com/kingwz/p/16638839.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步