数据的表示与运算
进位计数制
r进制计数法
K
n
K
n
−
1
…
…
K
2
K
1
K
0
K
−
1
K
−
2
…
…
K
−
m
=
K
n
∗
r
n
+
K
n
−
1
∗
r
n
−
1
+
…
…
+
K
2
∗
r
2
+
K
1
∗
r
1
+
K
0
∗
r
0
+
K
−
1
∗
r
−
1
+
K
−
2
∗
r
−
2
+
…
…
+
K
−
m
∗
r
−
m
K_{n}K_{n-1}……K_{2}K_{1}K_{0}K_{-1}K_{-2}……K_{-m} =K_{n}*r^{n}+K_{n-1}*r^{n-1}+……+K_{2}*r^{2}+K_{1}*r^{1}+K_{0}*r^{0}+K_{-1}*r^{-1}+K_{-2}*r^{-2}+……+K_{-m}*r^{-m}
KnKn−1……K2K1K0K−1K−2……K−m=Kn∗rn+Kn−1∗rn−1+……+K2∗r2+K1∗r1+K0∗r0+K−1∗r−1+K−2∗r−2+……+K−m∗r−m
基数:每个数码位所用到的不同符号的个数,r进制的基数为r(就是10进制的基数就是0、1、2、3、4、5、6、7、8、9这样)
进制转换
任意进制->十进制
K n K n − 1 … … K 2 K 1 K 0 K − 1 K − 2 … … K − m = K n ∗ r n + K n − 1 ∗ r n − 1 + … … + K 2 ∗ r 2 + K 1 ∗ r 1 + K 0 ∗ r 0 + K − 1 ∗ r − 1 + K − 2 ∗ r − 2 + … … + K − m ∗ r − m K_{n}K_{n-1}……K_{2}K_{1}K_{0}K_{-1}K_{-2}……K_{-m} =K_{n}*r^{n}+K_{n-1}*r^{n-1}+……+K_{2}*r^{2}+K_{1}*r^{1}+K_{0}*r^{0}+K_{-1}*r^{-1}+K_{-2}*r^{-2}+……+K_{-m}*r^{-m} KnKn−1……K2K1K0K−1K−2……K−m=Kn∗rn+Kn−1∗rn−1+……+K2∗r2+K1∗r1+K0∗r0+K−1∗r−1+K−2∗r−2+……+K−m∗r−m
就是原来那个
二进制<->八进制
从尾部开始(小数点前),三个为一组,每组转换成对应的八进制符号(如果前面不够了,就在最前面补0,凑齐三个,小数点后面不够了,就在最后面补0,凑齐三个)
例如:1111000010.01101
二进制<->十六进制
从尾部开始,四个为一组,每组转换成对应的十六进制符号(和八进制一样)
十进制->任意进制
整数部分和小数部分需要分开进行处理
十进制要转化为什么进制,就除以多少(图中是变成二进制),然后余数从k6-k0就是二进制形式(这是整数部分的)
当然一般都这么写
注:一般十进制转二进制都是先变成十六进制/八进制在变成二进制
小数点后就是乘以进制数(这图上是二进制)的方法,这里就是第一次就是第一位开始(一直到乘以进制数不再有小数位即可)
这里面可能会出现无限循环的情况,只做循环部分即可
这个应该就是多看看例题啥的就能理解,很简单
各种进制的常见书写方式
真值和机器数
真值:符合人类习惯的数字(可以有正负)
机器数:数字实际存到机器里的形式,正负号需要被“数字化”
知识回顾与重要考点
BCD码
本节总览
BCD码:用4个二进制位表示一个10进制(当然,这中间会有6种方式冗余)
8421码
就是4个二进制位的权值分别是8、4、2、1,同时因为权值固定被称为有权嘛
各个位如下表示
举个例子:
985 —1001 1000 0101
8421码的加法
例如
1+3
0001+0011=0100
5+8
0101+1000=1101
现在1101不在各位数字的映射表中,因此1101需要修正,也就是再+6(+0110)变成10011,最终用8421码表示就是0001 0011=13
9+9
1001+1001=10010
这很明显也是超出了,所以要修正也是+6(+0110),变成11000,8421码表示就是00010010=18
注:如果相加结果在映射表示范围内,则无需修正
余3码
很容易理解就是8421码+(0011)
当+0011后,发现每个位上的权值不在固定,因此余3码也被称为无权吗
2421码
其实就是把各个位上的权值改成了2、4、2、1,并且为了防止错误,规定0-4上的首尾只能是0,5-9上的首位必须是1
知识回顾与重要考点
字符与字符串
英文字符在计算机内的表示(ASCII码)
英文字符等总和只有128个,虽然只需要7位2进制数表示,但是计算机中一般使用2的倍数,那么就是8位
在计算机中,英文符号都是使用ASCII码表示的
其中32~126都是可印刷字符(普通字符),日常生活所用
其余都是控制、通信字符(例如127-DEL删除字符、6-ACK确认帧)
数字:48(0011 0000)~57(0011 1001)
可以发现前面都是0011,后面的四位刚好是对应的BCD码
大写字母:65(0100 0001)~90(0101 1010)
小写字母:97(0110 0001)~122(0111 1000)
可以发现前三位是不变的010,011,后面第一位都是0 0001开始
汉字在计算机中的表示与编码
GB2312-80:汉字+各种符号共7445个(1980年的,并且没有囊括所有)
区位码:94个区,每个区94个位置(就好像一个94*94的矩阵,每一个位置代表一个汉字)
解释:第一个16 01是啊汉字的区位码
第一次操作+20H
为了区分开ASCII码里面的通信、控制字符(被称为国标码)
第二次操作+80H
为了防止被误认为是ASCII码,直接超过128(被称为汉字内码)
当然,这只是存储在计算机内部的,其中输入输出还需要不同的编码
输入:输入编码(由输入法转化为国标码,然后由计算机内部转化为汉字内码)
输出:汉字字形码(每个汉字的输出其实是由许多像素点组成,输出是每个汉字不同,字形码就不同,对照输出)
字符串
首先是英文字符在计算机内部的存储
这个应该很容易理解,不需要解释吧
中文在计算机内部的存储
这中间分为两个模式(种类),一种是大端模式、一种是小端模式,其中的区别就是大端是数据的最高有效字节存放在低地址,小短是数据的最高有效字节存放在高地址单元中
知识回顾与重要考点
校验码
由于数据在存储、传输、运算过程中出现误差,因此需要校验数据是否正确
校验原理
码字:这其中一个A就是一个码字
码字间的距离:将两个码字进行对比,具有不同位的个数(例如左边的A和B,距离为1;右边的A和B,距离为2)
码距:一种编码方案有若干个合法码字(右边就是只有4种,A、B、C、D,各个合法码字之间的最小距离称为“码距”(d))
当d=1时,无检错能力;当d=2时,有检错能力;当 d ≥ 3 d\ge 3 d≥3时,若设计合理,可能具有检错,纠错能力
奇偶校验码
奇校验码:整个校验码(有效信息位和校验位)中“1”的个数为奇数。
偶校验码:整个校验码(有效信息位和校验位)中“1”的个数为偶数。
例题:
给出两个编码1001101和1010111的奇 校验码和偶校验码。
设最高位为校验位,余7位是信息位,则对应的奇偶校验码为:
奇校验:
\qquad
11001101
\qquad
01010111
偶校验:
\qquad
01001101
\qquad
11010111
这个就很容易从定义中理解,就不解释了
如何检错:
当发生位错误的时候,发现和定义不同,就知道这个错误了(但是不能知道那一位错误,因此奇偶校验码只有检错能力,没有纠错能力)
注:只能判断奇数次的位错误
硬件实现奇偶校验
偶校验:各信息进行异或(模2加)运算,得到的结果为偶校验位
上图是硬件对第一个编码1001101进行校验,很容易理解
知识回顾与重要考点
海明码
将信息位分组进行偶校验,分成k组,这样多个校验位就能确定错误的位置
k个校验码可以携带 2 k 2^{k} 2k种状态,而当校验码插入信息后,总共是n+k位,并且还包含了最原始正确的一种情况
因此我们可以通过公式 2 k ≥ n + k + 1 2^{k}\ge n+k+1 2k≥n+k+1来确定我们最终需要多少个校验位
海明码规定,第i个校验位,应该放到最终的海明码的 2 i − 1 2^{i-1} 2i−1的位置上
举例:
n为4,那么校验位就是3
数据码
D
4
D
3
D
2
D
1
D_{4}D_{3}D_{2}D_{1}
D4D3D2D1
校验码
P
3
P
2
P
1
P_{3}P_{2}P_{1}
P3P2P1
海明码就是
D
4
D
3
D
2
P
3
D
1
P
2
P
1
D_{4}D_{3}D_{2}P_{3}D_{1}P_{2}P_{1}
D4D3D2P3D1P2P1
校验码值的确定方式
P
1
P_{1}
P1就是当权值为1的那位是1的时候,进行异或操作
P 2 P_{2} P2就是当权值为2的那位是1的时候,进行异或操作
P 3 P_{3} P3就是当权值为4的那位是1的时候,进行异或操作
纠错方式:
我们用原来求P的值和P一起进行异或,如果没错能求出3个0,如果错误了,就会如下图一样显示错误的位数
补充内容:
海明码只有一位的纠错能力,也就是位错误到达两次及以上的时候海明码无法纠正错误
因此在实际应用中还会有一个全校验码,规则如下所示:
知识点回顾
循环冗余校验码(CRC码)
约定一个除数(二进制),如果余数不等于0则发生错误
校验位就是余数
如果出错就可以进行重传或者单比特位纠错
除数在题目中一般就是生成多项式
G
(
x
)
=
x
3
+
x
2
+
1
G(x)=x^{3}+x^{2}+1
G(x)=x3+x2+1就是除数1101
R位的校验码其实就是生成多项式的最高次幂(或者二进制的长度)
步骤:
- 确定K、R以及生成多项式对应的二进制码
K=信息码的长度
R=生成多项式的最高次幂(二进制的长度)
校验码位数N=K+R - 移位
信息码左移R位,低位补0 - 相除
对移位后的信息码,用生成多项式进行模2除法,产生余数 - 检错和纠错
发送为101001 001
接收为101001 001
然后在用1101进行模2除,余数为0,代表没有错
接收为101001 011
用1101进行模2除,余数为010,代表第二位出现问题
为啥对上面代表第二位出错画横线呢,因为如上图所示出错的可能不是第二位,可能是第9位,因此不一定(也就是说,信息码的长度太长,导致无法用三个比特位表示;相当于当信息码短的时候CRC拥有纠错能力,CRC码超过 2 检 验 码 位 数 2^{检验码位数} 2检验码位数时,没有检错能力)
举例:
信息码101001
生成多项式
G
(
x
)
=
x
3
+
x
2
+
1
G(x)=x^{3}+x^{2}+1
G(x)=x3+x2+1就是除数1101
这就是求校验码的过程,这里来讲述一下是如何进行的
这里的除法只看最高位,如果最高位为1,则商取1,然后后三位进行异或操作,如果最高位为0,则商取0,后三位进行异或操作。
最终会获得校验码(只比除数少一位)
最终的CRC码就是101001 001
CRC检错特点
- 可以检测出所有奇数个错误
- 可以检测出所有双比特的错误
- 可以检测出所有小于等于校验位长度的连续错误
知识回顾
定点数
定点数:小数点位置固定的数 \qquad 996.007
浮点数:小数点位置不固定的数 9.96007 ∗ 1 0 2 \qquad 9.96007*10^{2} 9.96007∗102
二进制的定点数和浮点数也和这个相似
无符号数
无符号数:整个机器字长的全部:二进制位均为数值位,没有符号位,相当于数的绝对值。
n位无符号数的表示范围:0~ 2 n − 1 2^{n}-1 2n−1
注:通常无符号数只有整数,没有小数
有符号数
定点整数
这个就很简单,除了第一位符号为以后全是整数的数值部分,小数点隐含在数值部分最后
原码:用尾数表示真值的绝对值,符号位“0/1”对应“正/负”
表示范围:
若机器字长n+1位,原码整数的表示范围
−
(
2
n
−
1
)
≤
x
≤
(
2
n
−
1
)
-(2^{n}-1)\le x \le (2^{n}-1)
−(2n−1)≤x≤(2n−1)关于原点对称
若机器字长n+1位,反码整数的表示范围
−
(
2
n
−
1
)
≤
x
≤
(
2
n
−
1
)
-(2^{n}-1)\le x \le (2^{n}-1)
−(2n−1)≤x≤(2n−1)关于原点对称
但是关于真值0的表示有些不同
[
−
0
]
反
=
11111111
[-0]_{反}=1 1111111
[−0]反=11111111
定点整数补码
[
x
]
补
=
10000000
[x]_{补}=1 0000000
[x]补=10000000表示x=
−
2
7
-2^{7}
−27
若机器字长n+1位,补码小数的表示范围
−
2
n
≤
x
≤
(
2
n
−
1
)
-2^{n}\le x \le (2^{n}-1)
−2n≤x≤(2n−1)(比原码多一个-2^{n}),真值0只有一种表示方式
若机器字长n+1位,移码整数的表示范围与补码相同(只能用于整数表示,作用是让计算机更容易比较大小)真值0只有一种表示方式
其中真值0有+0和-0两种形式(说明能表示的字数为 2 n + 1 − 2 2^{n+1}-2 2n+1−2个)
举例:
原码表示
+19D=0 0010011(符号位+19的二进制)
-19D=1 0010011(符号位+19的二进制)
常写为:
[
x
]
原
=
10010011
[x]_{原}=1 0010011
[x]原=10010011
反码表示
若符号位为0,则反码与原码相同
若符号位为1,则数值位全部取反
[
x
]
原
=
00010011
[x]_{原}=0 0010011
[x]原=00010011
[
x
]
反
=
00010011
[x]_{反}=0 0010011
[x]反=00010011
[
x
]
原
=
10010011
[x]_{原}=1 0010011
[x]原=10010011
[
x
]
反
=
11101100
[x]_{反}=1 1101100
[x]反=11101100
补码表示
正数的补码=原码
负数的补码=反码+1(要考虑进位)
[
x
]
原
=
00010011
[x]_{原}=0 0010011
[x]原=00010011
[
x
]
反
=
00010011
[x]_{反}=0 0010011
[x]反=00010011
[
x
]
补
=
00010011
[x]_{补}=0 0010011
[x]补=00010011
[
x
]
原
=
10010011
[x]_{原}=1 0010011
[x]原=10010011
[
x
]
反
=
11101100
[x]_{反}=1 1101100
[x]反=11101100
[
x
]
补
=
11101101
[x]_{补}=1 1101101
[x]补=11101101
移码表示
补码的基础上将符号位取反
[
x
]
原
=
00010011
[x]_{原}=0 0010011
[x]原=00010011
[
x
]
反
=
00010011
[x]_{反}=0 0010011
[x]反=00010011
[
x
]
补
=
00010011
[x]_{补}=0 0010011
[x]补=00010011
[
x
]
移
=
10010011
[x]_{移}=1 0010011
[x]移=10010011
[
x
]
原
=
10010011
[x]_{原}=1 0010011
[x]原=10010011
[
x
]
反
=
11101100
[x]_{反}=1 1101100
[x]反=11101100
[
x
]
补
=
11101101
[x]_{补}=1 1101101
[x]补=11101101
[
x
]
移
=
01101101
[x]_{移}=0 1101101
[x]移=01101101
定点小数
表示时的结构:
表示范围:
若机器字长n+1位,原码整数的表示范围
−
(
1
−
2
−
n
)
≤
x
≤
(
1
−
2
−
n
)
-(1-2^{-n})\le x \le (1-2^{-n})
−(1−2−n)≤x≤(1−2−n)关于原点对称
真值0同样也是两种形式
若机器字长n+1位,反码小数的表示范围 − ( 1 − 2 − n ) ≤ x ≤ ( 1 − 2 − n ) -(1-2^{-n})\le x \le (1-2^{-n}) −(1−2−n)≤x≤(1−2−n)关于原点对称
定点小数补码
[
x
]
补
=
1.0000000
[x]_{补}=1.0000000
[x]补=1.0000000表示x=1
若机器字长n+1位,补码小数的表示范围
−
1
≤
x
≤
(
1
−
2
−
n
)
-1\le x \le (1-2^{-n})
−1≤x≤(1−2−n)(比原码多一个-1)
原码表示
+0.75D=0 1100000
-0.75D=1 1100000
常写为:
[
x
]
原
=
1.1100000
[x]_{原}=1.1100000
[x]原=1.1100000
若为指明机器字长:
[
x
]
原
=
1.11
[x]_{原}=1.11
[x]原=1.11
反码表示
[
x
]
原
=
0.1100000
[x]_{原}=0.1100000
[x]原=0.1100000
[
x
]
反
=
0.1100000
[x]_{反}=0.1100000
[x]反=0.1100000
[
x
]
原
=
1.1100000
[x]_{原}=1.1100000
[x]原=1.1100000
[
x
]
反
=
1.0011111
[x]_{反}=1.0011111
[x]反=1.0011111
补码表示
[
x
]
原
=
0.1100000
[x]_{原}=0.1100000
[x]原=0.1100000
[
x
]
反
=
0.1100000
[x]_{反}=0.1100000
[x]反=0.1100000
[
x
]
补
=
0.1100000
[x]_{补}=0.1100000
[x]补=0.1100000
[
x
]
原
=
1.1100000
[x]_{原}=1.1100000
[x]原=1.1100000
[
x
]
反
=
1.0011111
[x]_{反}=1.0011111
[x]反=1.0011111
[
x
]
补
=
1.0100000
[x]_{补}=1.0100000
[x]补=1.0100000
注:当规定长度的时候,需要在高位补0,满足规定位数(看上面那个就是活生生的例子)
小技巧:由 [ x ] 补 快 速 求 [ − x ] 补 的 方 法 [x]_{补}快速求[-x]_{补}的方法 [x]补快速求[−x]补的方法,符号位、数值位全部取反,末位+1
原码、反码、补码的作用
补码:让减法操作转变为加法操作,节省硬件成本
注:没弄明白这节课的重点是什么
定点数运算
移位运算
算数移位
上图就是原码的算数右移,相当于数值除以2
上图是原码的算数左移,相当于乘以2
原码的算数移位—符号位保持不变,仅对数值位进行移位
右移:高位补0,低位舍弃。若舍弃的位=0,则相当于除以2;若舍弃的位不等于0,则丢失精度
左移:低位补0,高位舍弃。若舍弃的位=0,则相当于乘以2,若舍弃的位不等于0,则会出现严重误差
反码(正数)的算数移位
右移:高位补0,低位舍弃
左移:低位补0,高位舍弃
反码(负数)的算数移位
右移:高位补1,低位舍弃
左移:低位补1,高位舍弃
补码(正数)的算数移位
右移:高位补0,低位舍弃
左移:低位补0,高位舍弃
补码(负数)的算数移位
右移:高位补1,低位舍弃
左移:低位补0,高位舍弃
表格总结:
左移相当于乘以2,右移相当于除以2
由于位数有限,因此有时候无法用算数移位精确的等效乘除法(当有数值位是1被舍弃时)
逻辑移位
逻辑右移:高位补0,低位舍弃。
逻辑左移:低位补0,高位舍弃。
可以把逻辑移位看作是对无符号数的算数移位
循环移位
上图就是循环移位的操作,很容易理解
这些主要还是算数移位需要计算,别的都是拿来做其他操作,并不是运算
知识点回顾
加减运算
原码的加法运算
正+正→绝对值做加法,结果为正
负+负→绝对值做加法,结果为负
正+负→绝对值大的减绝对值小的,符号同绝对值大的数
负+正→绝对值大的减绝对值小的,符号同绝对值大的数
原码的减法运算(减数符号取反,转变为加法)
正-负→正+正
负-正→负+负
正-正→正+负
负-负→负+正
补码的加减与运算
[
A
+
B
]
补
=
[
A
]
补
+
[
B
]
补
[A+B]_{补}=[A]_{补}+[B]_{补}
[A+B]补=[A]补+[B]补
[
A
+
B
]
补
=
[
A
]
补
+
[
−
B
]
补
[A+B]_{补}=[A]_{补}+[-B]_{补}
[A+B]补=[A]补+[−B]补
[ − B ] 补 [-B]_{补} [−B]补= [ B ] 补 [B]_{补} [B]补连同符号位取反+1
移出判断
方法一:
A的符号位
A
S
A_{S}
AS
B的符号位
B
S
B_{S}
BS
S的符号位
S
S
S_{S}
SS
V
=
A
S
B
S
S
S
‾
+
A
S
‾
B
S
‾
S
S
V=A_{S}B_{S}\overline{S_{S}}+\overline{A_{S}}\overline{B_{S}}S_{S}
V=ASBSSS+ASBSSS
V=0,表示无溢出
V=1,表示有溢出
方法二:
采用一位符号位,根据数据位进位情况判断溢出
符号位进位 C S C_{S} CS 最高数值位的进位 C 1 C_{1} C1
上溢 C S = 0 C 1 = 1 C_{S}=0\qquad C_{1}=1 CS=0C1=1
下溢 C S = 1 C 1 = 0 C_{S}=1\qquad C_{1}=0 CS=1C1=0
即: C S ≠ C 1 C_{S}\ne C_{1} CS=C1时有溢出
在硬件中就是用异或
V
=
C
S
⊕
C
1
V=C_{S}\oplus C_{1}
V=CS⊕C1
V=0,表示无溢出
V=1,表示有溢出
方法三:
采用双符号数
正数符号为00,负数符号为11
当符号位=01时—上溢
当符号位=10时—下溢
硬件操作和方法二相同
符号扩展
正整数(因为原码反码补码都一样所以只有一个样子)
0 1011010→0 00000000 1011010
负整数
原码操作不变
1 1011010→1 00000000 1011010
反码、补码都是对原码做操作即可(和原来的原码变反码补码一样的操作)
正小数(因为原码反码补码都一样所以只有一个样子)
0.1011010→0.1011010 00000000
负小数
1.1011010→1.1011010 00000000
反码、补码都是对原码做操作即可(和原来的原码变反码补码一样的操作)
定点整数的符号扩展:在原符号位和数值位中间添加新位,正数都添0;负数原码添0,负数反、补码添1
定点小数的符号扩展:在原符号位和数值位后面添加新位,正数都添0;负数原、补码添0,负数反码添1
知识点回顾
乘法运算
这个二进制的算法其实和十进制的也没有什么区别
但是实际上计算机是无法使用这种方式的,因为数字有正负、需要求和的数太多了(有好多,只要记住计算机不会这么算就行)
原码乘法/除法
设机器字长为n+1=5位(含1位符号位),[x]原= 1.1101,[y]原= 0.1011,采用原码-一位乘法求x*y
符号位单独处理:符号位= x s ⊕ y s x_{s}\oplus y_{s} xs⊕ys
数值位取绝对值进行乘法计算
在硬件计算中,实现方式为先加法,再移位,重复n次(这个的话建议看视频,通俗易懂,言语解释比较难懂,其中还有后续的除法2021王道考研计算机组成原理)
浮点数
定点数可以表示的数字范围有限,但我们不能无限制地增加数据的长度
因此浮点数就出现了,为了在位数不变的状态下增加数据表示范围
浮点数的表示方法就和科学计数法相似
阶符表示科学计数法10的指数的正负
阶码表示10的指数大小(常用补码或移码表示的定点整数)
数符表示表示的数的正负
尾数表示数值(常用原码或补码表示的定点小数)
举例:
302657264526 = 3.026*
1
0
11
10^{11}
1011
用浮点数就是:阶符=0 阶码= ( 11 ) 10 (11)_{10} (11)10要用二进制表示(这里懒得写了),数符=0,尾数= ( 30265 … … ) 10 (30265……)_{10} (30265……)10,这里也是二进制,不换了,尾数会一直表示到位数用尽位置
因此尾数的位数会极大的影响到数字的精度
举例:
阶码、尾数均用补码表示,求a、b的真值
a=0 01 1 1001
b=0 10 0 01001
a的阶码为+1,尾数为-0.1001
b的阶码为+2,尾数为0.01001
a的值就是尾数的小数点右移一位的二进制
b的值就是尾数的小数点右移两位的二进制
浮点数尾数的规格化
就像上面的b所示,尾数其实浪费了一位,因此规格化就是要求b变为0 01 0 1001
也就是尾数的第一位必须是有效数字,至于前面要舍掉多少个0,就在阶码减多少
规格化浮点数:规定尾数的最高数值位必须是一个有效值。
左规:当浮点数运算的结果为非规格化时要进行规格化处理,将尾数算数左移一位,阶码减1
右规:当浮点数运算的结果尾数出现溢出(双符号位为01或10)时,将尾数算数右移一位,阶码加1。
右规举例:
这东西。。。例子看懂了,但是对于双符号位还是不懂
1.用原码表示的尾数进行规格化:
正数为0.1X x…的形式,其最大值表示为01…1;最小值表示为0.10…0。尾数的表示范围为1/2
≤
M
≤
\le M \le
≤M≤(1-2 ")。
负数为1.1X x…的形式,其最大值表示为1.0…0; 最小值表示为1…1. .尾数的表示范围为- (1 2 ") ≤ M ≤ \le M \le ≤M≤- 1/2。
规格化的原码尾数,最高数值位一定是1
2.用补码表示的尾数进行规格化:
正数为0.1X x…的形式,其最大值表示为011…1; 最小值表示为0.0…0。尾数的表示范围为1/2
≤
M
≤
\le M \le
≤M≤(1-2”)。
负数为1.0X x…的形式,其最大值表示为1.01…1 最小值表示为1.00…0。尾数的表示范围为-1 ≤ M ≤ \le M \le ≤M≤-(1/2+2 ")。
规格化的补码尾数,符号位与最高数值位一定相反
因为补码尾数符号位为0时,最高位要是1,为1时最高位要是0,并且要左移,因此就是左移三位,就是阶码-3,变成0 011 1 0100000
知识点回顾
浮点数标准IEEE 754
移码的定义:移码=真值+偏置值
在IEEE754中,偏置值就是127D=0111 1111B
这是IEEE754标准下的浮点数表示结构,分为数符、阶码和尾数(相比较之前的去掉了阶码的符号位,直接在阶码的最高位中表示)
并且在尾数中默认舍去了最高位的1(尾数用原码表示)
不同类型的数据类型,对应的浮点数长度不同,具体可由上面看出
短浮点数的真值: ( − 1 ) s ∗ 1. M ∗ 2 E − 127 (-1)^{s}*1.M*2^{E-127} (−1)s∗1.M∗2E−127
s是数符,代表数的正负
当阶码全0的时候表示,尾数的首位就是0,但是尾数不为0,表示为(0.xxx……)* 2 − 126 2^{-126} 2−126
当阶码全0,尾数全0,表示真值0
当阶码全1,尾数全0,表示无穷大
当阶码全1,尾数不全0,表示非数值NULL
浮点数运算
- 对阶
阶数小的向阶数大的对齐(也就是阶码变大,尾数部分逻辑右移) - 尾数加减
这个就很好理解了,就是加减 - 规格化
这个就是遵循浮点数规格(一般是IEEE) - 舍入
超过精度的位会被舍弃(例如尾数只有12位,但是真值有15位,就会被舍弃掉三位) - 判溢出
若是阶码超越规定位数,则判断为溢出
举例:
例:已知十进制数X=- -5/256、 Y=+59/1024 ,按机器补码浮点运算规则计算X- Y ,结果用二进制表示,浮点数格式如下:阶符取2位,阶码取3位,数符取2位,尾数取9位(一般在考卷中不会有IEEE 754,因为太长了)
机器补码浮点运算—用补码表示阶码和尾数
X=11 011 11 011000000
Y=11 100 00 111011000
(1)求阶差
[
△
E
]
补
=
11011
+
00100
=
11111
=
−
1
[\triangle E]_{补}=11011+00100=11111=-1
[△E]补=11011+00100=11111=−1(这就是负-负=负+[负]
补
_{补}
补,相当于左移一位)
(2)对阶 X:11 011 11 011000000 → 11 100 11 101100000
(3)尾数加减:
-Y:11 100 11 000101000
X-Y:11 100 10 110001000
(4)规格化
前面也讲过双符号位中10代表向上溢出,因此需要进行右规
11 101 11 011000100
(5)舍入
这里精度够,无需舍弃
(6)判断溢出
阶码正常,没有溢出
舍入用的方法:“0”舍“1”入法:类似于十进制数运算中的“四舍五入”法,即在尾数右移时,被移去的最高数值位为0,则舍去;被移去的最高数值位为1,则在尾数的末位加1。这样做可能会使尾数又溢出,此时需再做一次右规。
恒置“1”法:尾数右移时,不论丢掉的最高数值位是“1”还是“0”都使右移后的尾数末位恒置“1”。这种方法同样有使尾数变大和变小的两种可能。
强制类型转化
char→int→long→double
float→double
范围、精度从小到大,转换过程没有损失
32位
int:表示整数,范围
−
2
31
2
31
−
1
-2^{31}~2^{31}-1
−231 231−1,有效数字32位
float:表示整数及小数,范围 ± [ 2 − 126 2 127 ∗ ( 2 − 2 − 23 ) ] \pm [2^{-126}~2^{127}*(2-2^{-23})] ±[2−126 2127∗(2−2−23)],有效数字23+1=24位
int→float:可能损失精度
float→int:可能溢出及损失精度
知识点回顾
算数逻辑单元
算术逻辑单元由ALU和加法器构成
ALU
ALU需要接收信号(操作数),因此有端口
A
i
、
B
i
A_{i}、B_{i}
Ai、Bi
ALU需要接收指令(知道做什么操作),因此有端口
K
i
K_{i}
Ki
ALU需要输出结果,因此有端口
F
i
F_{i}
Fi
这是ALU的实际图片,可以清晰的看出A、B是四位,S是用来控制,F是输出的,其余的用来辅助(做一些别的事)
逻辑符号
与 表达式: Y = A ⋅ B Y=A·B Y=A⋅B(A、B相同时为1,不同时为2)
或 表达式: Y = A + B Y=A+B Y=A+B(A、B中有一个为1,就是1,全0是为0)
非 表达式: Y = A ‾ Y=\overline{A} Y=A(取反)
与、或、非的电路符号
虽然是基本知识,但是还是写一下
懒得打了,直接截图了,毕竟简单