"MOOC 计算机系统基础 袁春风 可见"
这门由南京大学袁春风老师讲授的计算机系统基础课程,旨在帮助学生深入理解计算机系统的底层运作原理。课程通过C语言程序举例,引导学生思考高级语言与机器指令之间的关系,以及编译器如何处理不同情况。课程涵盖了以下几个主要知识点:
1. **整数溢出和运算规则**:课程通过-2147483648与2147483647的比较,揭示了在32位系统中整数溢出的问题。例如,-2147483648是一个32位有符号整数的最大负值,当它与自身相加时,会因溢出而得到一个非预期的结果。理解这个问题需要了解编译器对字面量的处理、高级语言的运算规则以及机器级别的数据表示和运算。
2. **指针和数组操作**:在函数`sum(int a[], unsigned len)`的例子中,当len为0时,按理不应发生访存异常,但实际执行中可能会出现。这是因为数组索引从0开始,当len为0时,for循环不执行,理论上不会访问数组元素。然而,实际的异常可能源于编译器优化或未正确处理边界条件。理解此问题需要掌握高级语言中的运算规则、机器指令的执行以及异常检测和处理机制。
3. **数据类型和负数的表示**:当x为16位无符号整数,即65535,平方后赋值给y时,y的值可能变为-131071,这是因为在有符号整数表示中,高位溢出导致负数的表示。这个例子展示了现实世界中的数学运算与计算机中的二进制运算之间的差异。
4. **逻辑等价性与比较**:课程还讨论了`(x>y)==(-x<-y)`的逻辑等价性。在某些情况下,如x等于最小的有符号整数-2147483648,这个等价性并不成立,因为负数的溢出会导致非预期的结果。这再次强调了计算机世界中的运算并不总是符合直觉。
5. **浮点数和类型转换**:在`d=0,x=1072693248`的示例中,d原本是double型,但在`p1()`函数中被赋值为1.0。这涉及到类型转换和变量存储空间的问题。在某些系统中,将double型转换为int型时可能会丢失精度,导致x的值不是预期的200。此外,数据的大端/小端存储方式也会影响结果,特别是在多文件链接时的符号解析。
这门课程深入探讨了计算机系统的基础概念,包括高级语言到机器指令的转化、数据表示、内存管理、异常处理和类型转换等多个方面,旨在培养学生的系统思维能力,以便更好地理解和解决实际编程问题。