当前位置:首页 > 第二章习题-ddg
(3) 下述格式的浮点数(基数为2,移码的偏置常数为128)
数符 尾数 阶码
8位移码 7位原码数值部分
23. 以IEEE 754单精度浮点数格式表示下列十进制数。
+1.75,+19,–1/8,258
24.设一个变量的值为4098,要求分别用32位补码整数和IEEE 754单精度浮点格式表示该变量(结果
用十六进制形式表示),并说明哪段二进制位序列在两种表示中完全相同,为什么会相同? 25.设一个变量的值为–2 147 483 647(提示:2 147 483 647=231-1),要求分别用32位补码整数和IEEE754
单精度浮点格式表示该变量(结果用十六进制形式表示),并说明哪种表示其值完全精确,哪种表示的是近似值。
26.下表给出了有关IEEE 754浮点格式表示中一些重要的非负数的取值,表中已经有最大规格化数的相
应内容,要求填入其他浮点数格式的相应内容。
表2.16 题26用表
单精度 项目 0 1 最大规格化数 最小规格化数 最大非规格化数 最小非规格化数 +∞ NaN 阶码 11111110 尾数 1…11 以2的幂次表示的值 (2–2-23)×2127 以10的幂次表示的值 3.4×1038 双精度 以2的幂次 表示的值 (2–2-52)×21023 以10的幂次 表示的值 1.8×10308 1位
27.已知下列字符编码:A为100 0001,a为110 0001,0为011 0000,求E、e、f、7、G、Z、5的7位
ACSII码和在第一位前加入奇校验位后的8位编码。
28.假定在一个程序中定义了变量x、y和i,其中,x和y是float型变量(用IEEE754单精度浮点数表
示),i是16位short型变量(用补码表示)。程序执行到某一时刻,x= –0.125、y=7.5、i=100,它们都被写到了主存(按字节编址),其地址分别是100,108和112。请分别画出在大端机器和小端机器上变量x、y和i中每个字节在主存的存放位置。
29. 对于图2.6,假设n=8,机器数X和Y的真值分别是x和y。请按照图2.6的功能填写表2.17,并给
出对每个结果的解释。要求机器数用十六进制形式填写,真值用十进制形式填写。
表2.17 题29用表
表示 无符号 带符号 无符号 带符号 X 0xB0 0xB0 0x7E 0x7E x Y 0x8C 0x8C 0x5D 0x5D y X+Y x+y OF SF CF X-Y x-y OF SF CF 30. 在字长为32位的计算机上,有一个函数其原型声明为“int ch_mul_overflow(int x, int y);”,该函数用
于对两个int型变量x和y的乘积判断是否溢出,若溢出则返回1,否则返回0。请使用64位精度的整数类型long long来编写该函数。
31.对于第2.7.5节中例2.31存在的整数溢出漏洞,如果将其中的第5行改为以下两个语句:
unsigned long long arraysize=count*(unsigned long long)sizeof(int); int *myarray = (int *) malloc(arraysize);
已知C语言标准库函数malloc的原型声明为“void *malloc(size_t size);”,其中,size_t定义为unsigned
int类型,则上述改动能否消除整数溢出漏洞?若能则说明理由;若不能则给出修改方案。
32. 已知一次整数加法、一次整数减法和一次移位操作都只需一个时钟周期,一次整数乘法操作需要10
个时钟周期。若x为一个整型变量,现要计算55*x,请给出一种计算表达式,使得所用时钟周期数最少。
33.假设x为一个int型变量,请给出一个用来计算x/32的值的函数div32。要求不能使用除法、乘法、
模运算、比较运算、循环语句和条件语句,可以使用右移、加法以及任何按位运算。 34. 无符号整数变量ux和uy的声明和初始化如下: unsigned ux=x; unsigned uy=y;
若sizeof(int)=4,则对于任意int型变量x和y,判断以下关系表达式是否永真。若永真则给出证明;
若不永真则给出结果为假时x和y的取值。 (1)(x*x) >= 0 (2)(x-1<0) || x>0
(3)x<0 || -x<=0 (4)x>0 || -x>=0 (5)x&0xf!=15 || (x<<28)<0 (6)x>y==(-x<-y) (7)~x+~y==~(x+y) (8)(int) (ux-uy) == -(y-x) (9)((x>>2)<<2) <= x (10)x*4+y*8==(x<<2)+(y<<3) (11)x/4+y/8==(x>>2)+(y>>3) (12)x*y==ux*uy (13)x+y==ux+uy (14)x*~y+ux*uy==-x 35. 变量dx、dy和dz的声明和初始化如下: double dx = (double) x; double dy = (double) y; double dz = (double) z;
若float和double分别采用IEEE 754单精度和双精度浮点数格式,sizeof(int)=4,则对于任意int型变
量x、y和z,判断以下关系表达式是否永真。若永真则给出证明;若不永真则给出结果为假时x和y的取值。
(1)dx*dx >= 0 (2)(double)(float) x == dx (3)dx+dy == (double) (x+y) (4)(dx+dy)+dz == dx+(dy+dz)
(5)dx*dy*dz == dz*dy*dx (6)dx/dx == dy/dy 36. 在IEEE 754浮点数运算中,当结果的尾数出现什么形式时需要进行左规,什么形式时需要进行右规?
如何进行左规,如何进行右规?
37.在IEEE 754浮点数运算中,如何判断浮点运算的结果是否溢出?
38. 分别给出不能精确用IEEE 754单精度和双精度格式表示的最小正整数。 39.采用IEEE 754单精度浮点数格式计算下列表达式的值。
(1)0.75+(– 65.25) (2)0.75–(– 65.25)
40. 以下是函数fpower2的C语言源程序,它用于计算2x的浮点数表示,其中调用了函数u2f,u2f用于
将一个无符号整数表示的0/1序列作为float类型返回。请填写fpower2函数中的空白部分,以使其能正确计算结果。
1 float fpower2(int x) 2 { 3 unsigned exp, frac, u; 4 5 if (x< ) { /* 值太小,返回0.0 */
6 exp = ; 7 frac = ; 8 } else if (x< ) { /* 返回非规格化结果 */ 9 exp = ; 10 frac = ; 11 } else if (x< ) { /* 返回规格化结果 */ 12 exp = ; 13 frac = ; 14 } else { /* 值太大,返回+∞ */
15 exp = ; 16 frac = ; 17 } 18 u = exp << 23 | frac; 19 return u2f(u); 20 }
41. 以下是一组关于浮点数按位级进行运算的编程题目,其中用到一个数据类型float_bits,它被定义为
unsigned int类型。以下程序代码必须采用IEEE 754标准规定的运算规则,例如,舍入应采用就近舍入到偶数的方式。此外,代码中不能使用任何浮点数类型、浮点数运算和浮点常数,只能使用float_bits类型;不能使用任何复合数据类型,如数组、结构和联合等;可以使用无符号整数或带符号整数的数据类型、常数和运算。要求编程实现以下功能并进行正确性测试,需要针对参数f的所有32位组合情况进行处理。 (1)计算浮点数f的绝对值|f|。若f为NaN,则返回f,否则返回|f|。函数原型为: float_bits float_abs(float_bits f);
(2)计算浮点数f的负数-f。若f为NaN,则返回f,否则返回-f。函数原型为: float_bits float_neg(float_bits f);
(3)计算0.5*f。若f为NaN,则返回f,否则返回0.5*f。函数原型为: float_bits float_half(float_bits f);
(4)计算2.0*f。若f为NaN,则返回f,否则返回2.0*f。函数原型为: float_bits float_twice(float_bits f);
(5)将int型整数i的位序列转换为float型位序列。函数原型为: float_bits float_i2f(int i);
(6)将浮点数f的位序列转换为int型位序列。若f为非规格化数,则返回值为0;若f是NaN或±
∞或超出int型数可表示范围,则返回值为0x80000000;若f带小数部分,则考虑舍入。函数原型为:
int float_f2i(float_bits f);
共分享92篇相关文档