第二章习题答案9.在32 位计算机中运行一个C 语言程序,在该程序中出现了以下变量的初值,请写出它们对应的机器 数(用十六进制表示)。 (1)int x=-32768 (2 )short y=522 (3 )unsigned z=65530 (4 )char c=’@’ (5 )float a=-1.1 (6 )double b=10.5 本题要点: (1) 数据要根据其类型要表示到足够的位数,如题(3 ),要写成0000FFFA ,而不是FFFA (2) 因为求机器数,所以负数要用补码表示 (3) 浮点数要用IEEE 754 标准编码,要注意是float 还是double ,分别编码:阶码位数、尾数位数、 偏置常数各不相同。要表示到足够的位数。 (4) 16 进制数后面要写H 标识,二进制数后面要写B 标识 参考答案: (1)FFFF8000H 解:-215=-1000 0000 0000 0000B,负数符号位为1,int 型整数表示为32 位, 故机器数为1…1 1000 0000 0000 0000=FFFF8000H (2 )020AH 解:522=10 0000 1010B ,正数符号位为0,short 型整数表示为16 位, 故机器数为0000 0010 0000 1010=020AH (3 )0000FFFAH 解:65530=216-1-5=1111 1111 1111 1010B,unsigned 型整数表示为32 位,无符号位(高位补0 ), 故机器数为0000FFFAH (4 )40H 解:’@’的ASCII 码是40H ,char 型表示为8 位(5 )BF8CCCCCH 解:-1.1=-1.00011 [0011]…B=-1.000 1100 1100 1100 1100 1100B, float 型浮点数,阶码为127+0 (8 位),整数部1 为隐藏位,负数符号位为1, 故机器数为1000 1100 1100 1100 1100 1100=BF8CCCCCH (6 00000000H 解:10.5=1010.1B=1.0101B23 (左规), Double 型浮点数,阶码为1023+3=100 0000 0010,整数部1 为隐藏位,正数符号位为0, 故机器数为0 100 0000 0010 0101 [0000]00000000H 10. 在32 位计算机中运行一个C 语言程序,在该程序中出现了一些变量,已知这些变量在某一时刻的机 器数(用十六进制表示)如下,请写出它们对应的真值。 (1)int x :FFFF0006H (2 )short y:DFFCH (3 )unsigned z :FFFFFFFAH (4 )char c :2AH 5 )float a :C4480000H (6 )double b:C024800000000000H 本题要点 (1) 正确换算,结果最好表示成10 进制 (2 ) 注意数据类型,准确区分有符号数和无符号数,有符号数最高位为1 时为负数 (3 ) 正确解析浮点数 参考答案: (1)-65530 解:FFFF0006H=1 …1 0000 0000 0000 0110B ,最高位为1,所以为负数,int 型整数,所以真值 为其余为取反加1,故x= -1111 1111 1111 1010B= - (65535-5)=-65530 (2 )-8196 解:DFFCH= 1101 1111 1111 1100B=-010 0000 0000 0100B,最高位为1,所以为负数,short 型整 数,所以真值为其余为取反加1,故y=- (8192+4)=-8196 (3 )4294967290 (或232-6 ) 解:FFFFFFFAH=1 …1 1010B,最高位虽然为1,但为unsigned 型整数,所以解析为正整数,直 接展开换算,故z=232-6=4294967290 (4 )字符’*’ 解:2AH=0010 1010B ,故c 的值是42 ,且c 表示字符,故c 为字符’*’ (5 )-800 解:C4480000H=1100 0100 0100 1000 0…0B,因为是float 型浮点数数据,所以按照IEEE 754 标 准解析。符号位为1,所以为负数;阶码减掉偏置常数127 后有:阶为136-127=9;尾数考 9 虑隐藏位为:-1.1001B,故a=-1.1001B2 = -11 0010 0000B= -800 (6 )-10.25 解:C024800000000000H=1100 0000 0010 0100 1000 0 0…0B ,因为是double 型浮点数,所以按照 IEEE 754 标准解析。符号位为1,所以为负数;阶码为100 0000 0010,,减掉偏置常数1023 后有:阶为 3 1026-1023=3 ;尾数考虑隐藏位为1.01001B,故b=-1.01001B2 = 1010.01B=-10.25 17. 以下是一个由反汇编器生成的一段针对某个小端方式处理器的机器级代码表示文本,其中,最左边 是指令所在的存储单元地址,冒号后面是指令的机器码,最右边是指令的汇编语言表示,即汇编指 令。已知反汇编输出中的机器数都采用补码表示,请给出指令代码中划线部分表示的机器数对应的 真值。 80483d2: 81 ec b8 01 00 00 sub &0x1b8, %esp 80483d8: 8b 55 08 mov 0x8(%ebp), %edx 80483db: 83 c2 14 add $0x14, %edx 80483de: 8b 85 58 fe ff ff mov 0xfffffe58(%ebp), %eax 80483e4: 03 02 add (%edx), %eax 80483e6: 89 85 74 fe ff ff mov %eax, 0xfffffe74(%ebp) 80483ec: 8b 55 08 mov 0x8(%ebp), %edx 80483ef: 83 c2 44 add $0x44, %edx 80483f2: 8b 85 c8 fe ff ff mov 0xfffffec8(%ebp), %eax 80483f8: 89 02 mov %eax, (%edx) 80483fa: 8b 45 10 mov 0x10(%ebp), %eax 80483fd: 03 45 0c add 0xc(%ebp), %eax 8048400: 89 85 ec fe ff ff mov %eax, 0xfffffeec(%ebp) 8048406: 8b 45 08 mov 0x8(%ebp), %eax 8048409: 83 c0 20 add $0x20, %eax 本题要点: (1) 注意数据是小端方式,所以要注意字节的编排,如5字节:b8 01 00 00 ,表示的数是 “000001b8 ”。 (2 ) 上述指令都是整数运算指令,所以所有的数据均按整数换算 (3 ) 正确换算,不要计算错了 参考答案: (1)440 解:b8 01 00 00 :4 字节,但考虑小端数据格式,所以机器数为000001B8H,符号位为0,所以 为正整数,直接展开,真值为+ 1 1011 1000B = 440 (2 )20 解:14:单字节,机器数即为14H ,符号位为0,解析为正整数,所以真值为+ 1 0100B = 20 (3 )-424 解:58 fe ff ff:4 字节,考虑小端数据格式,所以机器数为FFFFFE58H ,符号位为1,所以为 负数,真值为其余位取反加1,所以真值为:-1 1010 1000B = -424 (4 )-396 解:74 fe ff ff :4 字节,考虑小端数据格式,所以机器数为FFFFFE74H ,符号位为1,所以为 负数,真值为其余位取反加1,所以真值为:-1 1000 1100B = -396 (5 )68 解:44 :单字节,机器数即为44H ,符号位为0,解析为正整数,所以真值为+ 100 0100B=68 (6 )-312 解:c8 fe ff ff :4 字节,考虑小端数据格式,所以机器数为FFFFFEC8H ,符号位为1,所以为 负数,真值为其余位取反加1,所以真值为:-1 1000 1100B = -312 (7 )16 解:10:单字节,机器数即为10H,符号位为0,解析为正整数,所以真值为+10000B=16 (8 )12 解:0c:单字节,机器数即为0CH ,符号位为0 ,解析为正整数,所以真值为:+1100B=12 (9)-276 解:ec fe ff ff :4 字节,考虑小端数据格式,所以机器数为FFFFFEECH ,符号位为1,所以为 负数,真值为其余位取反加1,所以真值为:-1 0001 0100B = -276 (10)32 解:20 :单字节,机器数即为20H ,符号位为0,解析为正整数,所以真值为=32 21 .以下是两段C 语言代码,函数arith( )是直接用C 语言写的,而optarith( )是对arith( ) 函数以某个确定 的M 和N 编译生成的机器代码反编译生成的。