Homework1 Answer
by ysy
T1
部分同学没有用 black boxes 表示出来,若是考试时需注意按照题目要求。
T2
- 对于正数,原码 = 反码 = 补码
- 对于负数,补码和原码之间的转换均为非符号位取反 + 1
T3
a.
b.
c.
d.
首先进行符号扩展至相同位数(和最长的一致),然后进行运算,得到的结果截取相同的位数,不用额外拓展一位。
详细请看教材 2.5.2 和 2.5.3。
T4
a. 1110_1011
b. 0001_1110
c. 1111_0000
d. 0000_0001
对于不足 8 位的,补符号位至 8 位;对于超过 8 位的,去符号位至 8 位。
T5
0 10000001 00010011001100110011010(注意末尾两位)
可能有同学得到的结果为 0 10000001 00010011001100110011001
但是事实上最后存在进位,(最后几位为 10011,进位为 1010)这不作要求,仅作拓展,也即题目描述的与 4.3 最接近的数
示例代码:
C
#include <stdio.h>
union my_union {
int a;
float b;
};
int main() {
union my_union t;
t.b = 4.3;
for (int loop = 31; loop >= 0; loop--) {
putchar((t.a & (1 << loop)) == 0 ? '0' : '1');
}
return 0;
}
指数位全为 1,小数位全为 0 表示无穷,正负号由符号位决定;
指数位全为 1,且小数位不全为 0 则表示 NaN。
T6
T7
a. 1010_0101 AND 1101_0101 = 1000_0101
b. 1000_1110 OR 1111_0101 = 1111_1111
c. NOT(1111_0001) OR NOT(0101_1010) = 0000_1110 OR 1010_0101 = 1010_1111
d. (x1234 AND X5678) OR (xABCD AND X99EF) = x1230 OR x89CD = x9BFD
e. x6A12 XOR x3A15 = x5007
T8
T9
- 两种解答
- 转义字符:000010 010000 101000 001101
CQoN - 非转义字符:010111 000111 010001 011100 011100 100101 110010 101110
XHRcblxy
- 转义字符:000010 010000 101000 001101
- 规避格式符号(将非 ASCII 字符的数据转换成 ASCII 字符)、仅允许字符的情况下传递信息(有特殊编码要求的文件,例如 html 文本)等。
T10
指数位为 254,小数位全为 1。
T11
随意舍入,不管它
- Mult
- Add
假定
以上答案由隔壁班助教提供,下面我作简要解释
题目中限制了 A,B 的范围就是希望不用考虑那些边界情况,也不用考虑 T5 中进位相关。
下面考虑两个 IEEE 浮点数的乘法:
- 对于指数位,可以直接相加,但是注意到真实指数的表示应该为
也即 - 对于小数位,分别在 A,B 的 23 位小数前补一个 1,然后相乘可得 48 位的 FRAC,注意我们需要取第一个 1 后面的 23 位小数。若
为 1,则指数位还需 + 1,小数位取 ;否则指数位不变,小数位取
为方便理解,再具体一点
如果
对于加法,也是同理可得
上述
小结
- 本次作业中出现的错误主要可分两类
- 一类是各种计算错误,包括十进制与二进制转换、十进制与 IEEE 浮点数转换、位运算等。
- 另一类则是对基础知识掌握的不清楚,例如原码与补码的具体转换方法、关于符号扩展和溢出的处理等
- 本次作业 T1-T8、T10 为我所出,都是基础题目,考试中一旦涉及基本属于送分题!T9 可作为拓展,简要了解即可;T11 难度较大,主要是为了帮助更好的理解 IEEE 浮点数。