前言:
《Computer Systems》学习笔记。
Ⅰ. 学习目的
为了培养对基础计算机系统的一般性理解,提高系统编程技能。数据表示和算术、机器级的程序表示、处理器结构、链接、控制流、虚拟内存、系统级IO、网络编程、并发编程。
Ⅱ. 举几个比较有意思的例子
0x00 例1 - Ints are not Integers
比如,对于 这个问题,
float:YES!
int :
💬 代码验证:
#include <stdio.h> int main(void) { int a = 40000; int b = 50000; printf("a * a = %d\n", a * a); printf("b * b = %d\n", b * b); return 0; }
🚩 运行结果如下:
首先 a * a (40000 * 40000)成功计算出了结果 —— 1600000000,这和我们预想的一样。
但是 b * b (50000 * 50000)计算的结果却并不是我们所预想的 2500000000,而是奇怪的 -1794967296,它计算出来的结果显然是错误的,因为其发生了溢出。
0x02 例2 - Floats are not Reals
再举个例子: 加法满足交换律与结合律。
对于 unsigned int 或 signed int 来说没啥问题。
但是对于 float 来说,情况似乎就不容乐观了:
💬 代码验证:
#include <stdio.h> int main(void) { printf("(1e20 + -1e20) + 3.14 = %f\n", (1e20 + -1e20) + 3.14 ); printf("(1e20 + -1e20) + 3.14 = %f\n", 1e20 + (-1e20 + 3.14) ); return 0; }
🚩 运行结果如下:
0x03 例3 - 内存引用错误的例子(Memory Referencing Bug)
🔑 出现这种情况的原因:
参考资料:
Computer Systems: A Programmer's Perspective (3rd Edition)