深入理解计算机系统笔记 2,信息的表示和处理

计算机将信息编码为位(比特),通常组织成字节序列。有不同的编码方式用来表示整数、实数和字符串。不同的计算机模型在编码数字和多字节数据中的字节顺序上使用不同的约定。

C语言被设计成包容多种不同字长和数字编码的实现。虽然高端机器逐渐开始使用64位字长,但是目前大多数机器仍使用32位字长。大多数机器对整数使用二进制补码编码,而对浮点数使用IEEE编码。在位级上理解这些编码,并且理解算术运算的数学特性,对于编写能在全部数值范围上正确计算的程序来说,是很重要的。

C语言的标准规定在无符号和有符合整数之间进行强制类型转换时,基本的位模式不应该改变。在二进制补码机器上,对于一个w位的值,这种行为是由函数T2Uw和U2Tw来描述的。C语言隐式的强制转换会得到许多程序员无法预计的结果,常常导致程序错误。

由于编码的长度有限,计算机运算与传统整数和实数运算相比,具有非常不同的属性。当超出表示范围时,有限长度能够引起数值溢出。当浮点数非常接近于0.0,从而转换成零时,浮点数也会外溢。

和大多数其他程序语言一样,C语言实现的有限整数运算和真实的整数运算相比有一些特殊的属性。例如,由于溢出,表达式x*x能够得出负数。但是无符号数和二进制补码的运算都满足环的属性。这就允许编译器做很多的优化。例如,用(x<<3)-x取代表达式7*x时,我们就利用了结合性、交换性和分配性,还利用了移位和乘以2的幂之间的关系。

我们已经看到了几种使用位级运算和算术运算组合的聪明方法。例如,我们看到,使用二进制补码运算,~x+1是等价于-x的。另外一个例子,假设我们想要一个形如[0,...,0,1,...,1]的位模式,由w-k个0后面紧跟着k个1组成。这些位模式对于掩码运算是很有用的。这种模式能够通过C表达式(1<<k)-1生成,利用的是这样一个属性,即我们想要的位模式的数值为2k-1。例如,表达式(1<<8)-1将产生位模式0xFF。

浮点表示通过将数字编码为x*2y的形式来近似地表示实数。最常见的浮点表示方式是由IEEE标准754定义的。它提供了几种不同的精度,最常见的单精度(32位)和双精度(64位)。IEEE浮点也能够表示特殊值无穷大8和NaN。

必须非常小心地使用浮点运算,因为浮点运算的范围和精度有限,而且浮点运算并不遵守普遍的算术属性,比如结合性。

你可能感兴趣的:(设计模式,C++,c,C#)