题目1
[可以看到这个练习中,从 [ 1011 ] 扩展到 [ 11011 ] 再扩展到 [ 111011 ] ,它们都是 -5 的补码表示。可见有符号数位扩展时候,左边扩展符号位,不会对它的数值有影响。]
[而且也验证了,对于无符号数来说,每一个数只有一种位向量表示,而对于有符号数(补码表示),同样都是-5,就有很多种表示,甚至是无限种,只要扩展符号位就可以。 -2019/5/6]
题目2
题目3
A: 当 s 比 t 短的时候,该函数会返回1
B:由于 strlen 被定义为产生一个无符号的结果,差和比较都采用无符号运算来计算。当 s 比 t 短的时候,strlen(s) - strlen(t)的差会为负,但是变成了一个很大的无符号数,大于0。
C:改为 return strlen(s) > strlen(t);
[ 举个负数变成了很大的无符号数的例子: 3 - 4 ===> [0011] - [0100] = [1111] ,这个[1111] 视为有符号数(补码),则为-1,结果正确了;视为无符号数,则为15,结果就错了。]
题目4
[ 十六进制D的位模式为 [1101] 所以十进制就是13,是无符号数,所以求反就是用(2的w次方 - x),16 - 13 = 3 ]
题目5
[5位位向量作为补码,能够表示的范围是-16~15,所以当十进制计算的结果小于-16,就加32(2的5次方),]
题目6
[为什么?可能有人在后面抓了一下我的痒痒肉吧 :-)]
补码相加会形成阿贝尔群,因此表达式(x + y)- x 总是得到y,无论加法是否溢出,而(x + y)- y 总是会得到x。
[模数相加会形成阿贝尔群 ,它是可交换的和可结合的。模数加法即对任何两个数据相加求模的运算,如任何对10的模数加法,如9 + 9 = 8。补码相加就是对2的w次方的模数相加,如 9 + 12 = 5,所以补码相加是模数相加,即一定形成阿贝尔群,即一定可交换可结合。 ]
题目7
题目8
题目9
题目10
题目11
题目12
题目13
题目14
题目15
题目16
题目17
题目18
题目19
函数 tmult_ok 是用来判断两个数相乘有没有溢出。