1.6 分析应用题
1 实现下列各数的转换。
(1)(125.125)10=(?)2=(?)8=(?)16
(2)(11101.01)2= (?)10=(?)8=(?)16=(?)8421
(3)(0111 1000 0101.0110)8421=(?)10=(?)2=(?)16
(4)(6A.B)16= (?)10=(?)2
分析解答(1)整数部分125接近127 = 27-1,即125 = 127-2 = 111 1111B-10B = 111 1101B;小数部分0.125等于0.25的一半,0.25又是0.5的一半,因此,0.125 = 0.001B。综合整数和小数部分,可知(125.125)10=(111 1101.001)2=(175.1)8=(7D.2)16。
(2)(11101.01)2=(29.25)10=(35.2)8=(1D.4)16=(0010 1001.0010 0101)8421。
(3)(0111 1000 0101.0110)8421=(785.6)10。整数部分785接近29=512,且785-512=273,273-256=17,17=16+1,因此785=11 0001 0001B;小数部分0.6接近0.5,且0.6-0.5 = 0.1,而0.1对应的二进制数是一个无限循环小数,即0.1=0.000 1100 [1100]…,因此0.6 = 0.100 1100 [1100]…。综合整数和小数部分,可知(785.6)10=(11 0001 0001.100 1100 [1100]…)2=(311.99[9]…)16。
(4)(6A.B)16= (106.6875)10=(110 1010.1011)2。
2 假定机器数为8位(1位符号,7位数值),写出下列各二进制小数的原码和补码表示。
+0.1011,-0.1011,+1.0,-1.0,+0.110101,-0.110101,+0,-0
分析解答 上述各二进制小数的原码和补码表示见表1.1。
表1.1 小数的原码和补码表示
3 假定机器数为8位(1位符号,7位数值),写出下列各二进制整数的补码和移码(偏置常数为1 000 0000)表示。
+1011,-1011,+1,-1,+110101,-110101,+0,-0
分析解答 上述各二进制数的补码和移码表示见表1.2。
表1.2 整数的补码和移码表示
4 若[x]补=1.x1x2x3x4,其中,小数点前面一位为符号位,当x1x2x3x4满足什么条件时,x<-1/2成立?
分析解答 补码的编码规则是:正数的补码,其符号位为0,数值位不变;负数的补码,其符号位为1,数值位各位取反,末位加1。从形式上来看,[x]补的符号位为1,故x一定是负数。因此,绝对值越大,数值越小,因而要满足x<–1/2,则x的绝对值必须大于1/2。因此,x1必须为0,x2x3x4中至少有一位为1,这样,各位取反末位加1后,x1对应的位一定为1,x2x3x4对应的位中至少有一位为1,使得x的绝对值保证大于1/2。因此,x1必须为0,x2x3x4中至少有一位为1。
5 已知[x]补,求x。
(1)[x]补=1110 0001
(2)[x]补=1000 0000
(3)[x]补=0111 1111
(4)[x]补=1111 1111
分析解答
(1)x = -1 1111B = -31
(2)x = -1000 0000B= -128
(3)x = +111 1111B = 31
(4)x = -00000001B = -1
6 将以下十进制数表示成无符号整数时至少需要几个二进位?
196,1020,1100,7503
分析解答 27-1<196<28-1,故至少需要8位。29–1<1020<210 –1,故至少需要10位。210–1<1100<211–1,故至少需要11位。212–1<7503<213–1,故至少需要13位。
7 假定某程序中定义了三个变量x、y和z,其中x和z为int型,y为short型。当x= -258,y =-20时,执行赋值语句z = x – y后,存放z的寄存器中的内容是什么?
分析解答 现代计算机中的带符号整数都用补码表示,因此,本题可以直接计算z的值,然后将z的补码形式求出来,也可以先将x和y的补码求出,再通过补码加/减运算求出z的补码表示。显然,前一种思路效率较高。对于前一种思路,执行赋值语句后,z = -238,因此,问题就变成了求-238的补码表示,其结果为[-000 0000 0000 0000 0000 0000 0000 1110 1110 ]补=1111 1111 1111 1111 1111 1111 0001 0010=FFFF FF12H。
8 假定sizeof(int)=4,表1.3中第一列给出了C语言程序中的关系表达式,请参照已有表栏内容完成表中后三栏内容的填写,并对其中的关系表达式“2147483647<(int) 2147483648U”的结果进行说明。
表1.3 关系表达式的运算结果
分析解答 表1.4为按照题目要求的填写结果。
表1.4 与表1.3对应的关系表达式的运算结果
8个关系表达式的运算结果分别是1、1、0、1、0、0、1、1,其中1表示“真”,0表示“假”。关系表达式“2147483647<(int)2147483648U”的结果为“假”。小于号右边的“2147483648U”是一个带后缀U的整数,因而是无符号整数类型,其机器数为“100…0”(1后面跟31个0),真值为231。强制类型转换为int型后,其真值为-231,即“-2147483648”,显然“2147483647<-2147483648”是不成立的,也即结果为“假”。
9 以下是一个C语言程序,用来计算一个数组a中每个元素的和。当参数len为0时,返回值应该是0,但在执行时,却发生了存储器访问异常。请问这是什么原因造成的,并说明程序应该如何修改。
1 float sum_elements (float a[], unsigned len) 2 { 3 int i; 4 float result = 0; 5 6 for (i = 0; i <= len-1; i++) 7 result += a[i]; 8 return result; 9 }
分析解答 存储器访问异常是由于对数组a进行访问时产生了越界或越权错误。循环变量i是int型,而len是unsigned型,当len为0时,执行len-1的结果为32个1,是最大可表示的32位无符号整数,任何无符号整数都比它小,使得循环体被不断执行,导致数组访问越界或越权,因而发生存储器访问异常。应当将参数len声明为int型。
10 考虑下列C语言程序代码:
int i =65535; short si = (short)i; int j = si;
假定上述程序段在某32位机器上执行,sizeof(int)=4,则变量i、si和j的值分别是多少?为什么?
分析解答 在一台32位机器上执行上述代码段时,i为32位补码表示的定点整数,第2行要求强行将一个32位带符号数整i截断为16位带符号整数,65535的32位补码表示为0000 FFFFH,截断为16位后变成FFFFH,它是-1的16位补码表示,因此si的值是-1。再将该16位带符号整数扩展为32位时,就变成了FFFF FFFFH,它是-1的32位补码表示,因此j的值也为-1。也就是说,i的值原来为65535,经过截断和再扩展后,其值变成了-1。
11 下列几种情况所能表示的数的范围是什么?
(1)15位无符号整数。
(2)15位原码定点小数。
(3)15位补码定点整数。
分析解答(1)15位无符号整数表示的范围为0~215-1,即0~32767。
(2)15位原码定点小数表示的范围为-(1-2-14)~+(1-2-14)。
(3)15位补码定点整数表示的范围为-214~+(214-1),即-16384~+16383。
12 设某浮点数格式为:
其中,移码的偏置常数为16,补码采用一位符号位和6位数值位,基数为4,尾数为规格化形式,不考虑隐藏位。
(1)用这种格式表示十进制数+1.625、-0.125、+20和-9/16。
(2)写出该格式浮点数的表示范围。
分析解答(1) +1.625 = +1.1010B = (+0.122)4×41,故阶码为1 + 16 = 17 = 10001B,尾数为四进制数+0.122的补码,即0.01 10 10B,因此,+1.625表示为0 10001 011010。
-0.125 = -0.0010B = (- 0.200)4×4-1,故阶码为-1 + 16 = 15 = 01111B,尾数为四进制数-0.200的补码,即1.10 00 00B,因此,-0.125表示为1 01111 100000。
+20 = +10100B = (+0.110)4×43,故阶码为3 + 16 = 19 = 10011B,尾数为四进制数+0.110的补码,即0.01 01 00B,因此,+20表示为0 10011 010100。
-9/16 = -0.1001B = (-0.210)4×40,故阶码为0 + 16 = 16 = 10000B,尾数为四进制数-0.210的补码,即1.01 11 00B,因此,-9/16表示为1 10000 011100。
(2)规格化浮点数的表示范围如下。
最大正数:+0.11 11 11B×411111B = (+0.333)4×415。
最小正数:+0.01 00 00B×400000B = (+0.100)4×4-16= +4-17。
最大负数:-0.01 00 00B×400000B = (-0.100)4×4-16= -4-17。
最小负数:-1.00 00 00B×411111B = (-1.000)4×415 = -415。
由于补码表示的尾数不是关于原点对称的,所以,浮点数的表示范围不是相对于原点对称的。
13 以IEEE 754单精度浮点数格式表示下列十进制数,要求将结果写成十六进制形式。
+1.625,-0.125,+20,-9/16
分析解答 +1.625 = +1.101B×20,符号位s = 0,阶码e = 0 +127 = 0111 1111B,尾数小数部分f = 0.101B,因此,+1.625用IEEE 754单精度浮点数格式表示为0 011 1111 1 101 0000 0000 0000 0000 0000,用十六进制形式表示为3FD0 0000H。
-0.125 = -0.001B = -1.0B×2-3,符号位s = 1,阶码e = -3 +127 = 0111 1100B,尾数小数部分f = 0.0B,因此,-0.125用IEEE 754单精度浮点数格式表示为1 011 1110 0 000 0000 0000 0000 0000 0000,用十六进制形式表示为BE00 0000H。
+20 = +10100B = +1.01B×24,符号位s = 0,阶码e = 4 +127 = 1000 0011B,尾数小数部分f = 0.01B,因此,+20用IEEE 754单精度浮点数格式表示为0 100 0001 1 010 0000 0000 0000 0000 0000,用十六进制形式表示为41A0 0000H。
-9/16 = -0.1001B = -1.001B×2-1,符号位s=1,阶码e = -1 +127 = 0111 1110B,尾数小数部分f = 0.001B,因此,-9/16用IEEE 754单精度浮点数格式表示为1 011 1111 0 001 0000 0000 0000 0000 0000,用十六进制形式表示为BF10 0000H。
14 设一个变量的值为2049,要求分别用32位补码整数和IEEE 754单精度浮点格式表示该变量(结果用十六进制表示),并说明哪段二进制序列在两种表示中完全相同,以及为什么相同。
分析解答 2049 = 1000 0000 0001B = +1.000 0000 0001B×211,用32位补码整数表示为0000 0000 0000 0000 0000 1000 0000 0001,用十六进制形式表示为 0000 0801H;用IEEE 754单精度浮点数格式表示时,符号位s=0,阶码e=11+127=10001010B,尾数的小数部分f=0.000 0000 0001B,因此,2049用IEEE 754单精度浮点数格式表示为0 100 0101 0 000 0000 0001 0000 0000 0000,用十六进制形式表示为4500 1000H。
在上述两种表示中,存在相同的二进制序列000 0000 0001。因为2049被转换为规格化浮点数后,有效数值部分中最前面的1被隐藏,其余数值部分为000 0000 0001,而2049的32位补码整数表示中保留了完整的有效数值部分,即最前面的1没有被隐藏,所以除了这个1之外,后面的二进制序列000 0000 0001是相同的。
15 设一个变量的值为-2147483630,要求分别用32位补码整数和IEEE 754单精度浮点格式表示该变量(结果用十六进制表示),并说明哪种表示其值完全精确,哪种表示的是近似值。(提示:2147483648 = 231。)
分析解答 -2147483630= -111 1111 1111 1111 1111 1111 1110 1110B = -1.11 1111 1111 1111 1111 1111 1110 1110×230。用32位补码表示为1000 0000 0000 0000 0000 0000 0001 0010(8000 0012H);用IEEE 754单精度格式表示时,最多只可表示24位有效二进位数字,而-2147483630的尾数为-1.11 1111 1111 1111 1111 1111 1(110 1110),有效二进位有30位,显然括号中的二进位必须舍入,因而是近似表示。按照就近舍入方式,得到舍入后的尾数为-10.00 0000 0000 0000 0000 0000 0,因此,-2147483630≈-1.000 0000 0000 0000 0000 0000×231,符号位s=1,阶码e=31+127=1001 1110B,尾数小数部分f=0.0…0,因此,用IEEE 754单精度浮点数格式近似表示为1 100 1111 0 000 0000 0000 0000 0000 0000 (CF00 0000H)。
因为-2147483630在 -231~231-1范围内,所以32位补码表示是精确的,而用IEEE 754单精度浮点数格式最多只可表示24位有效二进位数字,-2147483630的有效二进位有30位,因而是近似表示。
16 假定变量i、f和d的数据类型分别为int、float和double,sizeof(int)=4,已知i=1234567890,f = 1.23456789e10,要求给出以下各关系表达式的结果,并说明原因。
(1)i==(int)(float)i
(2)i==(int)(double)i
(3)f==(float)(int)f
(4)f==(float)(double)f
分析解答(1)结果为“假”。因为float类型采用IEEE 754单精度浮点数格式,尾数的小数部分只有23个二进位和一位隐藏位,共24位有效位数,相应地,十进制有效位数为7位,因而将i转换为float类型时会发生有效数字的丢失,再转换为int类型时,其值已经被改变了。
(2)结果为“真”。因为double类型采用IEEE 754双精度浮点数格式,其有效位数为52+1=53个二进位,而int型数据的有效位数为31个二进位,所以,对于任何一个int类型的变量,转换为double类型后,精度不会有任何损失,再转换回int类型时,其值不变。
(3)结果为“假”。因为变量f的值超过了int类型可表示的最大值,所以将f转换为int类型后再转换回float类型时,其值已经改变。
(4)结果为“真”。因为double类型的精度比float类型高,所以任何float类型变量的值转换为double后再转换回float类型时,其值不变。
17 假定一台32位字长的机器中,带符号整数用补码表示,浮点数用IEEE 754标准表示,寄存器R1和R2的内容分别为8020 0000H和0080 0000H。不同指令对寄存器进行不同的操作,因而,不同指令执行时寄存器内容对应的真值不同。假定执行下列运算指令时,操作数为寄存器R1和R2的内容,则R1和R2中操作数的真值分别为多少?
(1)无符号整数加法指令
(2)带符号整数乘法指令
(3)单精度浮点数减法指令
分析解答 寄存器R1的内容为1000 0000 0010 0000 0000 0000 0000 0000,寄存器R2的内容为0000 0000 1000 0000 0000 0000 0000 0000。
(1)对于无符号整数加法指令,R1 和R2的内容均被解释成无符号整数,即R1的真值为8020 0000H,R2的真值为80 0000H,也即R1的真值为231+221,R2的真值为223。
(2)对于带符号整数乘法指令,R1和R2的内容均被解释为补码整数,由最高位可知,R1为负数,R2为正数。R1的真值为 -0111 1111 1110 0000 0000 0000 0000 0000B = -7FE0 0000H,R2的真值为+80 0000H。也即R1的真值为-(231-221),R2的真值为223。
(3)对于单精度浮点数减法指令,R1和R2的内容均为IEEE 754单精度浮点数。由R1的内容可知,其符号位为1,表示负数,阶码为0000 0000,尾数部分为010 0000 0000 0000 0000 0000,因为阶码为全0尾数为非0数,故R1是非规格化浮点数,其指数为-126,尾数为0.01B,故R1表示的真值为-0.01B×2-126= -2-128。由R2的内容可知,其符号位为0,表示正数,阶码为0000 0001,尾数部分为000 0000 0000 0000 0000 0000,R1为规格化浮点数,其指数为1-127 = -126,尾数为1.0B,故R2表示的真值为+1.0×2-126=2-126。
18 IBM 370的短浮点数格式中,总位数为32位,左边第一位(b0)为数符,随后7位(b1~b7)为阶码,用移码表示,偏置常数为64,右边24位(b8~b31)为6位十六进制原码小数表示的尾数,规格化尾数形式为0.x1x2x3x4x5x6,x1~x6为十六进制表示,最高位x1为非0数,基为16。若用该浮点数格式表示十进制数-260.125,则对应的机器数是什么(要求用十六进制形式表示)?
分析解答 IBM 370的短浮点数格式的尾数采用十六进制原码表示,基数是16。因此,在进行数据转换时,要先转化成十六进制形式。-260.125 = -0001 0000 0100.0010B= (-104.2)16= (-0.1042)16×163。由此可知,浮点数符号位应为1,指数为3,用7位移码表示为64+3=100 0011B,故机器数前8位为 1 100 0011,对应的十六进制为C3H,尾数部分的6位十六进制数为10 4200H,因此,对应的机器数为C310 4200H。
19 假定在一个程序中定义了变量x、y和i,其中,x和y是float型变量(用IEEE 754单精度浮点数表示),i是16位short型变量(用补码表示)。程序执行到某一时刻,x = -130,y = 7.25,i = 130,它们都被写入主存(按字节编址),其地址分别是&x、&y和&i。请分别给出变量x、y和i的机器数,并分别说明在大端机器和小端机器上变量x、y和i的机器数中每个字节在内存中的存放位置。
分析解答 x = -130 = -100 00010B = -1.00 0001B×27,阶码e = 127 +7 = 128 +6 =1000 0110,因此,x用IEEE 754单精度浮点数表示为1 100 0011 0 000 0010 0000 0000 0000 0000 = C302 0000H。
y = 7.25 = 111.01B = +1.1101B×22,阶码e=127+2=128+1=1000 0001,因此,用IEEE 754单精度浮点数表示为0 100 0000 1 110 1000 0000 0000 0000 0000 = 40E8 0000H。
i = 130 = 1000 0010B,用16位补码表示为0082H。
上述三个数据在大端机器和小端机器上的存放位置如表1.5所示。
表1.5 数据在大端和小端机器中的存放位置
20 假定某计算机存储器按字节编址,CPU从存储器中读出一个4字节信息D=3234 3538H,该信息的内存地址为0000 F00CH,按小端方式存放,请回答下列问题。
(1)该信息D占用了几个内存单元?这几个内存单元的地址及其内容各是什么?
(2)若D是一个32位无符号数,则其值是多少?
(3)若D是一个32位补码表示的带符号整数,则其值是多少?
(4)若D是一个IEEE 754单精度浮点数,则其值是多少?
(5)若D是一个用8421码表示的十进制数,则其值是多少?
(6)若D是一个字符串,每个字节的低7位表示对应字符的ASCII码,则对应字符串是什么?
(7)若D是两个汉字的国标码,则这两个汉字在GB 2312字符集码表中分别位于哪一行和哪一列?
(8)若D中前3个字节分别是一个像素的RGB分量的颜色值,则其值各是多少?
分析解答 将3234 3538H展开为二进制表示,即0011 0010 0011 0100 0011 0101 0011 1000B。
(1)因存储器按字节编址,所以4个字节占用4个内存单元,其地址分别是0000 F00CH、0000 F00DH、0000 F00EH、0000 F00FH。因为采用小端方式存放,所以最低有效字节38H存放在0000 F00CH中,35H存放在0000 F00DH中,34H存放在0000 F00EH中,32H存放在0000 F00FH。
(2)无符号整数的值为229+228+225+221+220+218+213+212+210+28+25+24+23。
(3)带符号整数的符号为0,表示D为正数,其值与无符号整数的值一样。
(4)根据IEEE 754单精度浮点数格式可知,符号位s=0,为正数;阶码e=0110 0100B=100,故阶(指数)为100-127=-27;尾数小数部分f=0.011 0100 0011 0101 0011 1000,所以,其值为+1.011 0100 0011 0101 0011 1B×2-27。
(5)8421码表示的十进制数的值为32343538。
(6)ASCII码字符串中各字节的低7位分别为011 0010、011 0100、011 0101、011 1000,因此对应的字符串为“2458”。
(7)对国标码每个字节各自减20H,得到两个汉字的区位码,分别为1214H和1518H,也即,第一个汉字在GB 2312字符集码表中位于第18(12H)行、第20(14H)列,第二个汉字位于第21(15H)行、第24(18H)列。
(8)颜色值。该像素的RGB分量的颜色值分别为0011 0010B=50,0011 0100B=52,0011 0101B=53。