家庭作业 20135311傅冬菁
2.73 2.74 2.88 2.89 8.14 8.15 8.23 11.6#
2.73##
int saturating_add(int x, int y)
{
int w = sizeof(int)<<3;
int t = x + y;
int ans = x + y;
x>>=(w-1);
y>>=(w-1);
t>>=(w-1);
int pos_ovf = x&y&t;
int neg_ovf = x&y&~t;
int novf = ~(pos_ovf|neg_ovf);
return (pos_ovf & INT_MAX) | (novf & ans) | (neg_ovf & INT_MIN);
}
2.88##
选C
A. false,float只能精确表示最高位1和最低位的1的位数之差小于24的整数。所以当x==TMAX时,用float就无法精确表示,但double是可以精确表示所有32位整数的。 B. false,当x+y越界时,左边不会越界,而右边会越界。 C. true,double可以精确表示所有正负2^53以内的所有整数。所以三个数相加可以精确表示。 D. false,double无法精确表示2^64以内所有的数,所以该表达式很有可能不会相等。虽然举例子会比较复杂,但可以考虑比较大的值。 E. false,0/0.0为NaN,(非0)/0.0为正负inf。同号inf相减为NaN,异号inf相减也为被减数的inf。
2.89##
float fpwr2(int x)
{
unsigned exp,frac;
unsigned u;
if (x < -149)
{
exp = 0;
frac = 0;
}
else if (x < -126)
{
exp = 0;
frac = 1<<(x+149);
}
else if (x < 128)
{
exp = x + 127;
frac = 0;
}
else
{
exp = 255;
frac = 0;
}
u = exp << 23 | frac;
return u2f(u);
}
8.14##
解答:主进程只打印一行。主进程的直接子进程会打印一行,子进程的子进程又打印一行。所以是3行“hello”。
8.15##
解答:这里的子进程不是exit,而是return,说明两个子进程都要到回到main函数去打印那里的hello。所以是5行“hello”。
8.23##
解答:可能的原因是,在第一个信号发给父进程之后,父进程进入handler,并且阻塞了SIGUSR2,第二个信号依然可以发送,然而,之后的3个信号便会被抛弃了。因为是连续发送,所以很可能是没等上下文切换,这5个信号就同时发送了。所以只有2个信号被接收。
11.6##
解答:A. 因为read_requesthdrs中已经打印出了请求报头,所以只要打印请求行即可。在doit函数中第一个scanf语句之后添加下面的语句即可:printf("%s %s %s\n", method, uri, version);
B.用浏览器向TINY发送一个静态内容的请求。把TINY的输出记录到一个文件中。
C.浏览器使用HTTP/1.1
D.请求行和报头如下:
GET /clockwise.gif HTTP/1.1
User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:20.0) Gecko/20100101 Firefox/20.0 Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate Connection: keep-alive
User-Agent: 系统以及浏览器情况 Accept:可以接受的媒体;
Accept-Encoding:可以接受的编码方案; Accept-Language:能够接受的语言;