2.运算方法和运算器(一)
数据与文字的表示方法
数的机器码(原、反、补、移)
原码
比如,+7表示为0 111,-5表示为1 101
最高位是符号位,其余是数值位
需要注意的是:在原码中,“[0]原”有两种表示,一种是+0,一种是-0
反码
如果符号位是0(正数),反码和原码保持一致;如果符号位是1(负数),就是将原码的数值部分取反,符号位保持不变
比如:
[+0]原 = 0 0000000 → [+0]反 = 0 0000000
[-0]原 = 1 0000000 → [+0]反 = 1 1111111
补码
定义:把某数X加上模数M,称为以M为模的X的补码。
联想钟表,假如此时4点,但表是7点,我们可以退3格,也可以进9格,也就是-3=+9(mod 12)
说白了,就是把负数的部分,挪到正数部分的后头,原来贴近0的那部分负数,现在就跑到最大那边去了
转换方法:
-
正数的话,原码 = 反码 = 补码
-
负数的话,补码 = 反码 + 1
(技巧:找到最后一个是1的位,在这个位之前的所有位的取反,比如:+59是00111011,而-59是11000101)
特点:
-
变减为加,且符号位由计算获得(千万记得原码到反码,符号位不变啊!!!!)
-
0的补码只有一个,就是n位的0
移码
- 定义:在真值X上加上一个常数(偏移量),通常字长n+1时,偏移取2^n、
- 转换方法:补码的第一位(符号位)取反,其余不变
一般就是用于浮点数的阶码表示了…
表示范围
数据格式
定点数的表示
-
所谓定点,就是小数点位置固定不变。
-
通常表示为纯整数或者纯小数。
【Xn | Xn-1 Xn-2 ··· X1 X0】【符号|量值(尾数)】 共n+1位
如果是纯小数:
0
≤
∣
x
∣
≤
1
−
2
−
n
0 ≤ |x| ≤ 1 - 2^-n
0≤∣x∣≤1−2−n
如果是纯整数:
0
≤
∣
x
∣
≤
2
n
−
1
0 ≤ |x| ≤ 2^n - 1
0≤∣x∣≤2n−1
一般我们用纯整数,定点数表示的运算简称为整数运算
浮点数的表示
- 所谓浮点,就是小数点随比例因子的改变而自由浮动
- 数的范围和精度分别表示
十进制:
N
=
1
0
E
.
M
N = 10^E.M
N=10E.M
二进制:
N
=
2
e
.
M
N = 2^e.M
N=2e.M
(M为尾数,e为比例因子的指数,2是基数)
标准格式
float【 S(31) | E(30~23) | M(22~0) 】
double【 S(63) | E (62~52)| M(51~0) 】
- s=0,负数;s=1,正数
- M是尾数,在小数点的右边
- E是阶码,用移码表示正负指数,E = 指数真值e + 偏移127【01111111】
浮点数的三种表示
- 一个非规格化的float x可以表示为:
x = ( − 1 ) s ∗ ( 0. M ) ∗ 2 E x = (-1)^s * (0.M) * 2^E x=(−1)s∗(0.M)∗2E
为了提高数据表示的精度,当M不为0时,尾数域最高有效位应为1,也就是规格化表示:
-
①对于原码表示的尾数(|M|≥1/2)
- 正数:0.1xxx
- 负数:1.1xxx
-
②对于补码表示的尾数,当符号位和最高有效位相异
- 正数:0.1xxx
- 负数:1.0xxx
-
IEEE754标准(e = E - 127 or 1023)
正负浮点数表达式:
x
=
(
−
1
)
s
∗
(
1.
M
)
∗
2
e
x = (-1)^s * (1.M) * 2^e
x=(−1)s∗(1.M)∗2e
第一行最后应该是0,因符号位有±0之分
范围:
三种表示的比较
一些小练习😄
-
8位的定点小数的补码所能表示的数据范围是:
-
[-(1-2^(-8)), 1-2^(-8)]
-
[-1, 1-2^(-7)](√)
-
[-1, 1-2^(-8)]
-
[-(1-2^(-7)), 1-2^(-7)]
-
解析:和原码、反码相比,用补码表示时,负半轴可以多表示一个数据!最小数补码为10000000,真值 -1;最大数补码为01111111,真值为1-2^(-7)
- 将十进制数16.25转换成754标准的32位浮点数,其二进制的存储格式用十六进制表示为( )H。
解析:
- 首先把(16.25)10换成(10000.01)2,并且确认为正数,754标准的规格化浮点数
- 小数点前移4位至
1.M
格式:1.000001 * 2^4,即e=4,则E=4+127=131=1000 0011 - 【0|1000 0011|00000100…00】
- 最后转换:(0100 0001 1000 0010 0000 … 0000)
bin
= (41820000)hex
-
有一个字长为32位的浮点数,符号位1位,阶码8位,用移码表示;位数23位,用补码表示。请写出:
(1) 非规格化数能表示的最大正数、最小正数、最大负数和最小负数
(2) 规格化数能表示的最大正数、最小正数、最大负数和最小负数
(1)非规格化数:[x=(-1)^s * (0.M) * 2^E]
最大正数(原/补码) 0 11111111 111...1 真值为 +(1-2^-23)*(2^127)
最小正数(原/补码) 0 00000000 000...1 真值为 +(2^-23)*(2^-128)=+2^-151
最大负数(原码) 1 00000000 000...1 真值为 -(2^-23)*(2^-128)=-2^-151
最大负数(补码) 1 00000000 111...1
最小负数(原码) 1 11111111 111...1 真值为 -(1-2^-23)*(2^127)
最小负数(补码) 1 11111111 000...0 真值为 -2^127
(2)规格化数:
最大正数(原/补码) 0 11111111 111...1 真值为 +(1-2^-23)*2^127
最小正数(原/补码) 0 00000000 100...0 真值为 +(2^-1)*(2^-128)=2^-129
最大负数(补码) 1 00000000 011...1 真值为 -(2^-23+2^-1)*(2^-128)
最大负数(原码) 1 00000000 100...1
最小负数(补码) 1 11111111 000...0 真值为 -2^127
最小负数(原码) 1 11111111 111...1 真值为 -(1-2^-23)*2^127