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