第 二 章  答 案
1.给出以下概念的解释说明。
真值        机器数        数值数据    非数值数据        无符号整数        带符号整数
定点数        原码        补码        变形补码        溢出            浮点数
尾数        阶            阶码        移码            阶码下溢        阶码上溢
规格化数    左规        右规        非规格化数        机器零            非数(NaN)
BCD码        逻辑数        ASCII码    汉字输入码        汉字内码        机器字长
大端方式    小端方式      最高有效位  最高有效字节(MSB)                最低有效位
最低有效字节(LSB)        掩码        算术移位        逻辑移位        0扩展
符号扩展    零标志ZF    溢出标志OF    符号标志SF    进位/借位标志CF
2.简单回答下列问题。
(1)为什么计算机内部采用二进制表示信息既然计算机内部所有信息都用二进制表示,为什么还要用到十六进制或八进制数
(2)常用的定点数编码方式有哪几种 通常它们各自用来表示什么
(3)为什么现代计算机中大多用补码表示带符号整数
(4)在浮点数的基数和总位数一定的情况下,浮点数的表示范围和精度分别由什么决定两者如何相互制约
(5)为什么要对浮点数进行规格化有哪两种规格化操作
(6)为什么有些计算机中除了用二进制外还用BCD码来表示数值数据
(7)为什么计算机处理汉字时会涉及到不同的编码(如,输入码、内码、字模码)说明这些编码中哪些用二进制编码,哪些不用二进制编码,为什么
3.实现下列各数的转换。
(1)10= ()2= () 8= () 16
(2)2 = ()10= () 8= () 16= () 8421
(3)(0101 1001 8421 浮点型变量float= ()10= () 2= () 16
(4)16 = ()10= () 2
4. 假定机器数为8位(1位符号,7位数值),写出下列各二进制数的原码表示。
+,,+,,+,,+0,0
5. 假定机器数为8位(1位符号,7位数值),写出下列各二进制数的补码和移码表示。
+1001,1001,+1,1,+10100,10100,+0,0
6. 已知 [x],求x
(1)[x]=  (2)[x]=        (3)[x]=01010010  (4)[x]=
7.32位字长的机器中带符号整数用补码表示,浮点数用IEEE 754标准表示,寄存器R1和R2的内容分别为R1:0000108BH,R2:8080108BH。不同指令对寄存器进行不同的操
作,因而不同指令执行时寄存器内容对应的真值不同。假定执行下列运算指令时,操作数为寄存器R1和R2的内容,则R1和R2中操作数的真值分别为多少
(1)无符号数加法指令
(2)带符号整数乘法指令
(3)单精度浮点数减法指令
8. 假定机器M的字长为32位,用补码表示带符号整数。表第一列给出了在机器M上执行的C语言程序中的关系表达式,请参照已有的表栏内容完成表中后三栏内容的填写。
表 题8用表
关系表达式
运算类型
结果
说明
0 == 0U
–1 < 0
–1 < 0U
47 > –47 – 1
47U > –47 – 1
47 > (int) 48U
–1 > –2
(unsigned) –1 > –2
无符号整数
有符号整数
0
1
11…1B (232–1) > 00…0B(0)
011…1B (231–1) > 100…0B (–231)
9. 在32位计算机中运行一个C语言程序,在该程序中出现了以下变量的初值,请写出它们对应的机器数(用十六进制表示)。
(1)int x=-32768          (2)short y=522            (3)unsigned z=65530
(4)char c=@            (5)float a=            (6)double b=
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:C0000000H
11. 以下给出的是一些字符串变量在内存中存放的字符串机器码,请根据ASCII码定义写出对应的字符串。指出代码0AH和00H对应的字符的含义。
(1)char *mystring168H 65H 6CH 6CH 6FH 2CH 77H 6FH 72H 6CH 64H 0AH 00H 
(2)char *mystring277H 65H 20H 61H 72H 65H 20H 68H 61H 70H 70H 79H 21H 00H
12. 以下给出的是一些字符串变量的初值,请写出对应的机器码。
(1)char *mystring1="./myfile            (2)char *mystring2="OK, good!"   
13. 已知C语言中的按位异或运算“XOR”)用符号“^”表示。对于任意一个位序列aa^a=0,C语言程序可以利用这个特性来实现两个数值交换的功能。以下是一个实现该功能的C语言函数:
    1    void xor_swap(int *x, int *y)
    2  {
    3        *y=*x ^ *y;    /* 第一步 */
4        *x=*x ^ *y;    /* 第二步 */
5        *y=*x ^ *y;    /* 第三步 */
    6    }
    假定执行该函数时*x和*y的初始值分别为ab,即*x=a且*y=b,请给出每一步执行结束后,xy各自指向的内存单元中的内容分别是什么
14. 假定某个实现数组元素倒置的函数reverse_array调用了第13题中给出的xor_swap函数:
    1    void reverse_array(int a[], int len)
    2  {
    3        int left, right=len-1;
4        for (left=0; left<=right; left++, right--)
5          xor_swap(&a[left], &a[right]);
    6    }
len为偶数时,reverse_array函数的执行没有问题。但是,当len为奇数时,函数的执行结果不正确。请问,当len为奇数时会出现什么问题最后一次循环中的leftright各取什么值最后一次循环中调用xor_swap函数后的返回值是什么对reverse_array函数作怎样的改动就可消除该问题
15. 假设以下表中的xy是某C语言程序中的char型变量,请根据C语言中的按位运算和逻辑运算的定义,填写表,要求用十六进制形式填写。
    表 题15用表
x
y
x^y
x&y
x|y
~x|~y
x&!y
x&&y
x || y
!x || !y
x&&~y
0x5F
0xA0
0xC7
0xF0
0x80
0x7F
0x07
0x55
16对于一个nn≥8)位的变量x,请根据C语言中按位运算的定义,写出满足下列要求的
C语言表达式。
(1)x的最高有效字节不变,其余各位全变为0。
(2)x的最低有效字节不变,其余各位全变为0。
(3)x的最低有效字节全变为0,其余各位取反。
(4)x的最低有效字节全变1,其余各位不变。
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
18.  假设以下C语言函数compare_str_len用来判断两个字符串的长度,当字符串str1的长度大于str2的长度时函数返回值为1,否则为0。
1    int compare_str_len(char *str1, char *str2)
2    {
3        return strlen(str1) - strlen(str2) > 0;
    4  }
已知C语言标准库函数strlen原型声明为“size_t strlen(const char *s);”,其中,size_t被定义为unsigned int类型。请问:函数compare_str_len在什么情况下返回的结果不正确为什么为使函数正确返回结果应如何修改代码
19.考虑以下C语言程序代码:
1    int func1(unsigned word)
2    {
3        return  (int) (( word <<24) >> 24);
4    }
5    int func2(unsigned word)
6    {
7        return  ( (int) word <<24 ) >> 24;
8    }
假设在一个32位机器上执行这些函数,该机器使用二进制补码表示带符号整数。无符号数采用逻辑移位,带符号整数采用算术移位。请填写表,并说明函数func1和func2的功能。
表 题19用表
w
func1(w)
func2(w)
机器数
机器数
机器数
127
128
255
256
20.填写表,注意对比无符号整数和带符号整数的乘法结果,以及截断操作前、后的结果。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。