问答题
设浮点数字长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;
}
【答案解析】