有以下两段C语言程序代码:int funl(unsigned short si) int fun2 (unsigned short si}return . (s1*256) ; return (( (short) s1*256) /256) ;请回答下列问题:
问答题 假设计算机硬件不提供直接乘除运算功能,如何实现上述函数的功能?函数funl和fun2得到的结果各有什么特征?
【正确答案】正确答案:因为256=28,所以上述函数中的乘、除运算可以分别用左、右移运算来实现。可用“左移8位”代替“乘256”的操作,用“右移8位”代替“除以256”的操作。funl(si)相当于将Si逻辑左移8位,结果的最后8位都为0;fun2(si)相当于将Si先算术左移8位,再算术右移8位,所以结果的范围在—128~127之间。
【答案解析】
问答题 根据以上程序填写表4—4(要求机器数用十六进制表示)。
【正确答案】正确答案:根据表中的数据和函数,所得结果如表4—6所示。
【答案解析】
问答题 表中的哪些数据异常?并分析“异常”产生的原因。
【正确答案】正确答案:表4—6中,加粗的数据是一些异常的结果,即当si=128时,fun2返回的结果异常,当si=256时,funl与fun2返回的结果均异常。si=128时,由于截断低16位乘积得到的第一位(符号位)为1,因此再进行算术右移时高位补了8位1,导致fun2的函数值“溢出”,出现了异常结果;当si=256时,由于256×si=65536,因此用16位无符号整数无法表示实际结果,导致funl和fun2结果都为0。
【答案解析】