The CS:APP Data Lab
- insorker
- 2021/6/9
Hello
辞退了一些事情,现在成了无业游民,不过终是于闲下来了。也算一个新的开始,有点自己的时间做点喜欢的事情了
所以,你好,CSAPP!
Introduction
第一章的 Lab 是关于整数、浮点数在计算机内部的存储与计算。
虽然数据存储是一件很基础、很自然的事情,大部分时候我们甚至感觉不到它们的存在,因为被认为是理所应当(点名批评弱类型语言)。不过这些仍然很重要,数学计算的错误是非常严重的,可能会带来灾难性的后果,这里引用原文的例子:
哎,没举例呢,想看自己买一本实体书吧~
提前约定一下,大写字母表示单个比特位,小写字母表示一串比特数据
Problems
1. bitXor
/*
* bitXor - x^y using only ~ and &
* Example: bitXor(4, 5) = 1
* Legal ops: ~ &
* Max ops: 14
* Rating: 1
*/
int bitXor(int x, int y) {
return 2;
}
很遗憾,我查了很多地方都没有找到符号 ^ 的正确转义(https://www.onemathematicalcat.org/MathJaxDocumentation/TeXSyntax.htm),有人知道的话务必留言告诉我
首先理解一下异或是什么
A 异 或 B = A ‾ B + B ‾ A A 异或 B = \overline{A}B + \overline{B}A A异或B=AB+BA
取反和与题目是允许使用的,那么唯一的难点是如何创造出或
根据摩根定律我们可以把 & 和 | 相互转换得到
A | B = ~((~A) & (~B))
所以,可得最终结果
int bitXor(int x, int y) {
return ~(~(~x & y) & ~(~y & x));
}
2. tmin
/*
* tmin - return minimum two's complement integer
* Legal ops: ! ~ & ^ | + << >>
* Max ops: 4
* Rating: 1
*/
int tmin(void) {
return 2;
}
这题很简单啊,不解释
int tmin(void) {
return 1 << 31;
}
3. isTmax
/*
* isTmax - returns 1 if x is the maximum, two's complement number,
* and 0 otherwise
* Legal ops: ! ~ & ^ | +
* Max ops: 10
* Rating: 1
*/
int isTmax(int x) {
return 2;
}
错误示范:
- ! (x + x + 2) :x = -1时候不行
- !(x ^ ~(x + 1)):同理 x = -1 时候不行
除了错误示范,经过我的测试,还存在很多匪夷所思的地方,比如
int main() {
int a;
scanf("%d", &a);
// 0x7FFFFFFF
printf("%d\n", !!(a + 1));
printf("%d\n", (a + 1) + (a + 1));
printf("%d\n", 0x7FFFFFFF);
printf("%d\n", a); // <- 在这里
printf("%d\n", (a + 1));
printf("%d\n", !!(a + 1) & !(a + a + 2));
printf("%d\n", isTmax(a));
return 0;