计算机系统结构期末考试题
作者:互联网
第一题
下列两个程序分别在C, 32位系统上运行,请分析最后的运行结果。
程序一:
int main(){
int value, count_value;
float sota;
scanf("%d\n", &value);
sota = (float)value;
count_value = (int)sota;
printf("%d", sota - count_value);
}
程序二:
int main(){
float sota = 0.1*INT_MAX;
float sum = 0.1;
while(1){
if(sum >= sota)break;
sum += 0.1;
}
printf("%lf", sum);
}
各位客官先不要着急看答案,可以自己思考一下,有基本的系统结构的知识的同学应该不难回答这两个问题,所以,请大家把答案打在下方的评论区,然后再来看吧!
第二题
请详细分析下列语句中出现的相关性种类。
L.D
L.D
L.D
MUL
ADD
S.D
L.D
L.D
L.D
答案揭晓
程序一 : 输出为 -64 至 63 之间的整数值,都为合理。
因为这是系统中所有的误差值,三十二位的操作系统,其有效值位为23,一个符号位,七个指数位,故输出的可能值是 最大的截断值,全一指数(127),然后右移一位,即128/2 - 1 = 63, 负数因为使用符号位,补码表示,则是-64,
所以答案是一个区间,[-64, 63] 。
程序二 : 死循环
此程序表达的意思为,充分理解浮点数和整数的关系,为什么会是死循环呢?
因为当程序运行到一定阶段,每次只加0.1就没有用了,加不上去,相加产生的误差就是第一个程序那样,高达七位,那样0.1*INT_MAX这个指标永远也实现不了,所以出不来!
所以答案是程序会陷入循环中出不来 。
作者在写这道题的时候,天真的以为,强制类型转换不就是截断和加长吗,第一题就是0啊,第二题那不就输出 0.1*INT_MAX+0.1吗,这下一看,恍然大悟,不是一个层面啊,虽然0也是合理的,毕竟0属于[-64, 63]的区间内,第二题就跑的没边了!
要是有收获,就请点个赞吧,您的支持是我最大的动力!
标签:计算机系统,sota,0.1,sum,float,程序,value,期末考试,结构 来源: https://blog.csdn.net/TTLoveYuYu/article/details/118571498