读CSAPP之字节序列、数和转换

Computer System: A Programmer’s Perspective

计算机系统的一个基本概念就是,从机器的角度来看,程序仅仅只是字节序列,机器没有关于初始源程序的任何信息。

在几乎所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的字节。但是多个字节如何排布则有两种不同的方式。最低有效字节在最前面的方式,叫做小端法。最高有效字节在最前面的方式,叫做大端法。

绝大多数时候,字节顺序不关紧要,但是有三种情形必须考虑,首先,在不同类型的机器之间通过网络传送二进制数据;其次,反编译代码,阅读表示整数数据的字节序列;还有,在C语言中使用强制类型转换。

[ Read More » ]

读K&R之指针、数组名和数组指针

The C Programming Language

数组名所代表的就是该数组最开始的一个元素的地址。其和指针是不同的,区别在于指针是一个变量,但数组名不是变量。

当把数组名传递给一个函数时,实际上传递的是该数组第一个元素的地址。在被调用函数中,该参数是一个局部变量,因此,数组名参数必须是一个指针,也就是一个存储地址值的变量。

如果p是一个指向数组中某个元素的指针,那么p+=i将对p进行加i的增量运算,使其指向指针p当前所指向的元素之后的第i个元素。对数组元素a[i]的引用也可以写成*(a+i)这种形式。

[ Read More » ]

读K&R之变量、求值顺序和副作用

The C Programming Language

对变量的命名与符号常量的命名存在一些限制条件,名字是由字母和数字组成的序列,但其第一个字符必须是字母。下划线“_”被看作是字母,通常,变量名使用小写字母,符号常量名全部使用大写字母。

对于内部名而言,至少前31个字符是有效的。函数名和外部变量名包含的字符数目可能少于31,这是因为汇编程序和加载程序可能会使用这些外部名,而语言本身是无法控制加载程序和汇编程序。对于外部名,ANSI标准仅保证前6个字符的唯一性,并且不区分大小写。

任何变量的声明都可以使用const限定符限定。该限定符指定变量的值不能被修改。对于数组而言,const限定符指定数组所有元素的值都不能被修改。

默认情况下,外部变量和静态变量都被初始化为0。未经显式初始化的自动化变量的值为未定义值(即无效值)。

[ Read More » ]

读K&R之幻数、返回值和参数传递

The C Programming Language

在程序中使用“幻数”是个坏习惯,它几乎不能提供任何信息。要避免这个问题,就是使用#define指令把符号名定义为一个特定的字符串。这使我想起来了在《深入Java虚拟机》一书中看到的一段话:

例如每个class文件必须是以四个同样的字节开始:魔数0xCAFEBABE。这个魔数的用处是让class文件分析器很容易分辨出某个文件有明显问题而加以拒绝。1

上面的“幻数”与“魔数”应该都是英文术语magic number的翻译,我把它理解成一个有特定意义的数字,这个数字没有名字,没人知道它代表什么意思,因此阅读程序代码的人就可能糊涂。——当然,0xCAFEBABE不会有人去读它,我只是想到了magic number这个词而已。

[ Read More » ]

读CSAPP之公理和抽象

Computer System: A Programmer’s Perspective

中国语言文化很深奥,同样的话,不同人说,不同场合说,表达的意思就千差完毕。所以,要揣摩说话者的心思,就得把他的话放到具体的语境里,稍不留神就会弄出岔子。

通常,人们认为计算机没有二义性,一是一,二十二。实际上,在计算机中,所有的信息表示方式都是一致的,存在着同样一段表示形式对应的信息是不唯一的。

只有在指明了特定的解读方式以后,这些表现形式才能表示唯一的信息,我把它定义为计算机系统第一公理:

  1. 信息由一串位表示,只有在特定的上下文中,其才具有意义。

计算机系统是硬件和系统软件的结合体,硬件构成了物理存在,见上图。而系统软件更多指的是操作系统,其具备两个基本功能:

    [ Read More » ]