第二章习题答案2(1)为什么计算机内部采用二进制表示信息?既然计算机内部所有信息都用二进制表示,为什么还要用到十六进制和八进制数?参考答案:(略)2(7)为什么计算机处理汉字时会涉及到不同的编码(如,输入码、内码、字模码)?说明这些编码中哪些是用二进制编码,哪些不是用二进制编码,为什么?参考答案:(略)3.实现下列各数的转换。(1)(25.8125)10=(?)2=(?)8=(?)16(2)(101101.011)2=(?)10=(?)8=(?)16=(?)8421(3)(010110010110.0011)8421=(?)10=(?)2=(?)16(4)(4E.C)16=(?)10=(?)2参考答案:(1)(25.8125)10=(11001.1101)2=(31.64)8=(19.D)16(2)(101101.011)2=(45.375)10=(55.3)8=(2D.6)16=(01000101.001101110101)8421(3)(010110010110.0011)8421=(596.3)10=(1001010100.01001100110011…)2=(254.4CCC…)16(4)(4E.C)16=(78.75)10=(01001110.11)24.假定机器数为8位(1位符号,7位数值),写出下列各二进制数的原码和补码表示。+0.1001,–0.1001,+1.0,–1.0,+0.010100,–0.010100,+0,–0参考答案:(后面添0)原码补码+0.1001:0.10010000.1001000–0.1001:1.10010001.0111000+1.0:溢出溢出–1.0:溢出1.0000000+0.010100:0.01010000.0101000–0.010100:1.01010001.1011000+0:0.00000000.0000000–0:1.00000000.00000005.假定机器数为8位(1位符号,7位数值),写出下列各二进制数的补码和移码表示。+1001,–1001,+1,–1,+10100,–10100,+0,–0参考答案:(前面添0)移码补码+1001:1000100100001001–1001:0111011111110111+1:1000000100000001–1:01111111111111111+10100:1001010000010100–10100:0110110011101100+0:1000000000000000–0:10000000000000006.已知[x]补,求x(1)[x]补=1.1100111(2)[x]补=10000000(3)[x]补=0.1010010(4)[x]补=11010011参考答案:(1)[x]补=1.1100111x=–0.0011001B(2)[x]补=10000000x=–10000000B=–128(3)[x]补=0.1010010x=+0.101001B(4)[x]补=11010011x=–101101B=–457.假定一台32位字长的机器中带符号整数用补码表示,浮点数用IEEE754标准表示,寄存器R1和R2的内容分别为R1:0000017AH,R2:FFFFF895H。不同指令对寄存器进行不同的操作,因而,不同指令执行时寄存器内容对应的真值不同。假定执行下列运算指令时,操作数为寄存器R1和R2的内容,则R1和R2中操作数的真值分别为多少?(1)无符号数加法指令(2)带符号整数乘法指令(3)单精度浮点数减法指令参考答案:R1=0000017AH=00000000000000000000000101111010R2=FFFFF895H=11111111111111111111100010010101(1)对于无符号数加法指令,R1和R2中是操作数的无符号数表示,因此,其真值分别为R1:17AH,R2:FFFFF895H。(对应十进制分别为378、4294965397=232–1899)(2)对于带符号整数乘法指令,R1和R2中是操作数的带符号整数补码表示,由最高位可知,R1为正数,R2为负数。R1的真值为+17AH=378,R2的真值为–11101101011=–1899。(3)R1:符号位为0,表示其为正数,阶码为00000000,尾数部分为00000000000000101111010,故其为非规格化浮点数,指数为–126,尾数中没有隐藏的1,用十六进制表示尾数为+0.000000000000001011110100=+0.0002F4H,故R1表示的真值为+0.0002F4H×2-126。R2:符号位为1,表示其为负数,阶码为11111111,尾数部分为11111111111100010010101,故其为全1阶码非0尾数,即是一个非数NaN。8.假定机器M的字长为32位,用补码表示带符号整数。下表第一列给出了在机器M上执行的C语言程序中的关系表达式,请参照已有的表栏内容完成表中后三栏内容的填写。关系表达式类型结果说明0==0U–10–10U2147483647–2147483647–12147483647U–2147483647–12147483647(int)2147483648U–1–2(unsigned)–1–2无有无有无有有无1101011100…0B=00…0B11…1B(–1)00…0B(0)11…1B(232–1)00…0B(0)011…1B(231–1)100…0B(–231)011…1B(231–1)100…0B(231)011…1B(231–1)100…0B(–231)11…1B(–1)11…10B(–2)11…1B(232–1)11…10B(232–2)9.以下是一个C语言程序,用来计算一个数组a中每个元素的和。当参数len为0时,返回值应该是0,但是在机器上执行时,却发生了存储器访问异常。请问这是什么原因造成的,并说明程序应该如何修改。1floatsum_elements(floata[],unsignedlen)2{3inti;4floatresult=0;56for(i=0;i=len–1;i++)7result+=a[i];8returnresult;9}参考答案:参数len的类型是unsigned,所以,当len=0时,执行len-1的结果为11…1,是最大可表示的无符号数,因而,任何无符号数都比它小,使得循环体被不断执行,引起数组元素的访问越界,发生存储器访问异常。只要将len声明为int型,或循环的测试条件改为ilen。10.设某浮点数格式为:阶码S1尾数S1数符S16位补码数值S15位移码S11位S1其中,移码的偏置常数为16,补码采用一位符号位,基数为4。(1)用这种格式表示下列十进制数:+1.75,+19,–1/8。(2)写出该格式浮点数的表示范围,并与12位定点补码整数表示范围比较。参考答案:(假定采用0舍1入法进行舍入)(1)+1.75=+1.11B=0.011100B×41,故阶码为1+16=17=10001B,尾数为+0.011100的补码,=1.1100B×40=0。130Q×41=1.30Q×40即0.011100,所以+1.75表示为010001011100。+19=+10011B=0.010011B×43,故阶码为3+16=19=10011B,尾数为0.010011,所以+19表示为010011010011。–1/8=–0.125=–0.001B=–0.100000×4–1,阶码为–1+16=15=01111B,尾数为–0.100000的补码,即1.100000,所以–1/8表示为101111100000。(2)该格式浮点数表示的范围如下。正数最大值:0.111111B×411111,即:0.333×415(≈230≈109)正数最小值:0.000001B×400000,即:0.001Q×4–16(≈2–34≈10–10)负数最大值:–0.000001B×400000,即:–0.001×4–16负数最小值:–1.000000B×411111,即:–1.000×415因此,该格式浮点数的数量级在10–10~109之间。12位定点补码整数的表示范围为:–211~+(211–1),即:–2048~2047由此可见,定点数和浮点数的表示范围相差非常大。11.下列几种情况所能表示的数的范围是什么?(1)16位无符号整数(2)16位原码定点小数(3)16位补码定点小数(4)16位补码定点整数(5)下述格式的浮点数(基数为2,移码的偏置常数为128)尾数S1阶码S1数符S18位移码S17位原码S11位S1参考答案:(1)无符号整数:0~216–1。(2)原码定点小数:–(1–2–15)~+(1–2–15)。(3)补码定点小数:–1~+(1–2–15)。(4)补码定点整数:–32768~+32767。(5)浮点数:负数:–(1–2–7)×2+127~–2–7×2–128。正数:+2–135~(1–2–7)×2+127。12.以IEEE754单精度浮点数格式表示下列十进制数。+1.75,+19,–1/8,258参考答案:+1.75=+1.11B=1.11B×20,故阶码为0+127=01111111B,数符为0,尾数为1.110…0,小数点前为隐藏位,所以+1.7表示为00111111111000000000000000000000,用十六进制表示为3FE00000H。+19=+10011B=+1.0011B×24,故阶码为4+127=10000011B,数符为0,尾数为1.00110…0,所以+19表示为01000001100110000000000000000000,用十六进制表示为41980000H。–1/8=–0.125=–0.001B=–1.0×2–3,阶码为–3+127=01111100B,数符为1,尾数为1.0…0,所以–1/8表示为10111110000000000000000000000000,用十六进制表示为BE000000H。258=100000010B=1.0000001B×28,故阶码为8+127=10000111B,数符为0,尾数为1.0000001,所以258表示为01000011100000010000000000000000,用十六进制表示为43810000H。13.设一个变量的值为6144,要求分别用32位补码整数和IEEE754单精度浮点格式表示该变量(结果用十六进制表示),并说明哪段二进制序列在两种表示中完全相同,为什么会相同?参考答案:6144=+1100000000000B=+1.1×21232位补码形式为:00000000000000000001100000000000(00001800H)IEEE754单精度格式为:01000101110000000000000000000000(45C00000H)蓝字部分为除隐藏位外的有效数字,因此,在两种表示中是相同的序列。因为正数的补码和原码是一致的,所以除隐藏位外的有效数字都相同。14.设一个变量的值为–6144,要求分别用32位补码整数和IEEE754单精度浮点格式表示该变量(结果用十六进制表示),并说明哪种表示其值完全精确,哪种表示的是近似值。参考答案:–6144=–1100000000000B=–1.1×21232位补码形式为:11111111111111111110100000000000(FFFFE800H)IEEE754单精度格式为:11000101110000000000000000000000(C5C00000H)32位补码形式能表示精确的值,浮点数表示的也是精确值,因为没有有效数字被截断。15.下表给出了有关IEEE754浮点格式表示中一些重要数据的取值,表中已经有最大规格化数的相应内容,要求填入其他浮点数的相应内容。(注:表中a代表一个在1到10之间的正纯小数)项目阶码尾数单精度双精度以2的幂次表示的值以10的幂