信息的表示
关于位,数据类型,无符号和有符号编码及其转换 这部分比较基础,不在此赘述,实践中会加深理解。这里再加深一下补码编码的定义的印象
B
2
T
w
(
x
)
=
−
x
w
−
1
∗
2
w
−
1
+
∑
i
=
0
w
−
2
x
i
2
i
B2T_w(x)=-x_{w-1}*2^{w-1}+\sum_{i=0}^{w-2}x_i2^i
B2Tw(x)=−xw−1∗2w−1+i=0∑w−2xi2i
信息的处理
1. 整数加法(减法就是有符号数的加法)
无符号加法较为简单,溢出模
2
w
2^w
2w就可以了。
有符号加法比较复杂
-
−
2
w
−
1
<
=
x
+
y
<
2
w
−
1
-2^{w-1} <=x+y < 2^{w-1}
−2w−1<=x+y<2w−1
这种情况是易于理解的,属于正常的情况,但是负数加法的情况是可能会理解偏差。
假设两个负数的补码相加值是满足上述关系的,但是在二进制补码形式下是溢出一位的,例如
x = 1111 y = 1011 x + y = 11010 x = 1111 \\ y=1011 \\ x+y = 11010 x=1111y=1011x+y=11010
但是这种情况下溢出的一位实际上是符号位扩展,截断是不影响的。 - 其他正溢出和负溢出的情形比较好理解。
2. 整数乘法
不考虑补码乘法器的实现的话是比较好理解的,还是位截断,补码解码的方式。
因为乘法器的底层实现比较复杂,所以会消耗较多的时钟周期,编译器可能会通过移位和加法的组合来完成常数乘法
3. 整数除法
这里主要讨论了除以2的幂可以采用移位的方式进行加速,但是补码运算需要考虑舍入的方向,
这里需要明确
算术右移:最高位填充符号位。正数填充0,负数填充1(有符号数)
逻辑右移:最高位填充(无符号数)
左移都是补0
4. 浮点数运算
IEEE浮点数的编码格式
V
=
(
−
1
)
s
×
(
f
+
1
)
×
2
(
E
−
b
i
a
s
)
V = (-1)^s\times (f+1)\times 2^{(E-bias)}
V=(−1)s×(f+1)×2(E−bias)
其中编码位为
浮点数的运算书上没有细讲,可以看一下https://blog.csdn.net/m0_37972557/article/details/84594879的讲解