问答题 设浮点数字长32位,其中阶码部分8位(含1位阶符),尾数部分24位(含1位数符),当阶码的基值分别是2和16时:
问答题 说明基值2和16在浮点数中如何表示。
【正确答案】基值2和16在浮点数中是隐含表示的,并不出现在浮点数中。
【答案解析】
问答题 当阶码和尾数均用补码表示,且尾数采用规格化形式时,给出这两种情况下所能表示的最大正数真值和非零最小正数真值。
【正确答案】最大正数,也就是,尾数最大且规格化,阶码最大的数;最小正数,也就是,尾数最小且规格化(t为基值时,尾数的最高log2t位不全为0的数为规格化数),阶码最小的数。
当阶码的基值是2时,最大正数:0,1111111;0,11…1,真值是(1-2-23)×2127;最小正数:1,000 0000;0,10…0,真值是2-129
当阶码的基值是16时,最大正数:0,111 1111;0,11…1,真值是(1-2-23)×16127;最小正数:1,000 0000;0,0001…0,真值是16-129
【答案解析】
问答题 在哪种基值情况下,数的表示范围大?
【正确答案】在浮点数表示中,基值越大,表示的浮点数范围就越大,所以基值为16的浮点数表示范围大。
【答案解析】
问答题 两种基值情况下,对阶和规格化操作有何不同?
【正确答案】对阶时,需要小阶向大阶看齐,若基值为2的浮点数尾数右移一位,阶码加1;而基值为16的浮点数尾数右移4位,阶码加1。 格式化时,若基值为2的浮点数尾数最高有效位出现0,则需要尾数向左移动一位,阶码减1;而基值为16的浮点数尾数最高4位有效位全为0时,才需要尾数向左移动,每移动4位,阶码减1。
【答案解析】
问答题 一个程序员在一台字长为32位的计算机上,写出下面的代码,从计算机计算能力是否充分利用的角度来看,该代码是否高效,如果高效请说明原因,如果还有缺点请指出,并提出解决方法并附上改进后的代码。(char为8位存储空间,int为32位存储空问) int compare (char *A, r char *B) { if(A==B) return strlen(A); int len, i; if(strlen(A)>strlen(B)) len=strlen(A); else len=strlen (B); for(i=0; i<len&&A[i]==B[i];(i++); return i; }
【正确答案】本函数最主要的操作就是A[i]=B[i],但由于A[i]和B[i]都是char类型的,故每次用32位的运算器来进行char变量的比较,都是将char变量转换为int类型后进行比较的。这其实浪费了运算器3/4的运算能力。所以改进方法就是,一次比较连续的4个char变量,代码如下: int compare(char *A, char *B) { if(A==B) return strlen (A); int *a, *b; char *a1, b1; a=(int*)A; b=(int*)B; while(*a++==*b++); a1=(char*)--a; b1=(char*)--b; while(*a1++==*b1++); --b1; return b1-B; }
【答案解析】