二进制补码的算术运算满足代数环的特性,编译器可以很安全的把一个常量乘法转化为一些列的移位和加法;
程序员和编译器不能用表达式(x-y<0)来替代(x<y)因为前者可能产生溢出。甚至于也不能用表达式(-y<-x)来替代,因为在二进制补码中表示负数和正数的范围是不对称的。
算术溢出是造成程序错误和安全漏洞的一个常见根源;
程序阶段:预处理,(hello.i)->编译(hello.s),->汇编(hello.o),->链接
hello.c->hello.i->hello.s->hello.o->可执行程序
pirntf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,这个文件以某种方式合并到我们的**.o程序之中,由链接器来处理;
几个疑问:1、一个switch语句是否总是比一系列的if-else高效?
2、指针引用比数组索引更有效吗?
3、while循环比for循环更有效吗?
4、为什么将循环求和的结果放到一个本地变量中,与将其放到一个通过引用传递过来的参数中相比,运行速度快很多?
文件是对i/o设备的抽象表示;虚拟存储器是对主存和磁盘I/O设备的抽象表示;进程则是对处理器,内纯和I/O设备的抽象表示,进程是OS对一个正在运行的程序的一种抽象;
当执行与pc相关的寻址时,程序计数器的值是跳转指令后面的那条指令的地址,而不是跳转指令的本身的地址;这种惯例可以追溯到早期实现,当时的处理器会将更新程序计数器作为执行指令的第一步;