没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
Computer Systems: A Programmer’s Perspective
Instructor’s Solution Manual
1
Randal E. Bryant
David R. O’Hallaron
December 4, 2003
1
Copyright
c
2003, R. E. Bryant, D. R. O’Hallaron. All rights reserved.
2
Chapter 1
Solutions to Homework Problems
The text uses two different kinds of exercises:
Practice Problems. These are problems that are incorporated directly into the text, with explanatory
solutions at the end of each chapter. Our intention is that students will work on these problems as they
read the book. Each one highlights some particular concept.
Homework Problems. These are found at the end of each chapter. They vary in complexity from
simple drills to multi-week labs and are designed for instructors to give as assignments or to use as
recitation examples.
This document gives the solutions to the homework problems.
1.1 Chapter 1: A Tour of Computer Systems
1.2 Chapter 2: Representing and Manipulating Information
Problem 2.40 Solution:
This exercise should be a straightforward variation on the existing code.
code/data/show-ans.c
1 void show_short(short int x)
2 {
3 show_bytes((byte_pointer) &x, sizeof(short int));
4 }
5
6 void show_long(long int x)
7 {
8 show_bytes((byte_pointer) &x, sizeof(long));
9 }
1
2
CHAPTER 1. SOLUTIONS TO HOMEWORK PROBLEMS
10
11 void show_double(double x)
12 {
13 show_bytes((byte_pointer) &x, sizeof(double));
14 }
code/data/show-ans.c
Problem 2.41 Solution:
There are many ways to solve this problem. The basic idea is to create some multibyte datum with different
values for the most and least-significant bytes. We then read byte 0 and determine which byte it is.
In the following solution is to create an int with value 1. We then access its first byte and convert it to an
int. This byte will equal 0 on a big-endian machine and 1 on a little-endian machine.
code/data/show-ans.c
1 int is_little_endian(void)
2 {
3 /* MSB = 0, LSB = 1 */
4 int x = 1;
5
6 /* Return MSB when big-endian, LSB when little-endian */
7 return (int) (* (char *) &x);
8 }
code/data/show-ans.c
Problem 2.42 Solution:
This is a simple exercise in masking and bit manipulation. It is important to mention that ˜0xFF is a way
to generate a mask that selects all but the least significant byte that works for any word size.
(x & 0xFF) | (y & ˜0xFF)
Problem 2.43 Solution:
These exercises require thinking about the logical operation ! in a nontraditional way. Normally we think
of it as logical negation. More generally, it detects whether there is any nonzero bit in a word.
A. !!x
B. !!˜x
C. !!(x & 0xFF)
D. !!(˜x & 0xFF)
Problem 2.44 Solution:
1.2. CHAPTER 2: REPRESENTING AND MANIPULATING INFORMATION
3
There are many solutions to this problem, but it is a little bit tricky to write one that works for any word
size. Here is our solution:
code/data/shift-ans.c
1 int int_shifts_are_arithmetic()
2 {
3 int x = ˜0; /* All 1’s */
4
5 return (x >> 1) == x;
6 }
code/data/shift-ans.c
The above code peforms a right shift of a word in which all bits are set to 1. If the shift is arithmetic, the
resulting word will still have all bits set to 1.
Problem 2.45 Solution:
This problem illustrates some of the challenges of writing portable code. The fact that 1<<32 yields 0 on
some 32-bit machines and 1 on others is common source of bugs.
A. The C standard does not define the effect of a shift by 32 of a 32-bit datum. On the SPARC (and
many other machines), the expression x << k shifts by
, i.e., it ignores all but the least
significant 5 bits of the shift amount. Thus, the expression 1 << 32 yields 1.
B. Compute beyond_msb as 2 << 31.
C. We cannot shift by more than 15 bits at a time, but we can compose multiple shifts to get the
desired effect. Thus, we can compute set_msb as 2 << 15 << 15, and beyond_msb as
set_msb << 1.
Problem 2.46 Solution:
This problem highlights the difference between zero extension and sign extension. It also provides an excuse
to show an interesting trick that compilers often use to use shifting to perform masking and sign extension.
A. The function does not perform any sign extension. For example, if we attempt to extract byte 0 from
word 0xFF, we will get 255, rather than
.
B. The following code uses a well-known trick for using shifts to isolate a particular range of bits and to
perform sign extension at the same time. First, we perform a left shift so that the most significant bit
of the desired byte is at bit position 31. Then we right shift by 24, moving the byte into the proper
position and peforming sign extension at the same time.
code/data/xbyte.c
1 int xbyte(packed_t word, int bytenum)
2 {
剩余88页未读,继续阅读
资源评论
- zhouxinlzu2016-09-01不是作业吧。
- 一無是處2015-12-10很详尽,但是还有一些细小的地方需要自己斟酌
wanzygui
- 粉丝: 1
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功