我在《程序是怎样跑起来的》第三章主要学到了计算机进行小数运算时出错的原因。
计算机内部所有的信息都是以二进制数的形式来处理的,在这一点上整数和小数没有区别。将1011.0011这个有小数的二进制数转换成十进制数,如图
了解将二进制数表示的小数转换成十进制数,那计算机运算出错的原因就容易理解了。计算机之所以出现运算错误,是因为“有一些十进制的小数无法转换成二进制数”。在图3-2中,小数点后4位用二进制数表示时的数值范围为0.0000~0.1111。因此,这里只能表示0.5、0.25、0.125、0..625这四个二进制数小数点后面的位权组合而成的小数。将这些数值组合后能过表示的数值,即表3-1中所示的无序的十进制数
实际上,十进制数0.1转换成二进制后,会变成0.00011001100…这样的循环小数。计算机这个功能有限的设备,是无法处理无限循环的小数。因此无法正确表示的数值,最后都变成了近似值。计算机运算就会出错。
采用浮点数来处理小数是计算机出错的原因之一。如何避免计算机计算错误呢?
回避策略,既无视这些错误。根据程序目的的不同,有时一些微小的偏差并不会造成什么问题。另一策略是把小数转换成整数来计算。计算机进行小数计算时可能会出错,当进行整数运算时一定不会出错。
我在第四章主要了解了有关内存的知识。
首先是内存的物理机制,内存实际上是一种名为内存IC的电子元件。内存IC中有电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚,通过为其指定地址,来进行数据的读写。总体来讲,内存IC内部有大量可以存储8位数据的地方,通过地址制定这些场所之后即可进行数据的读写。
其次,内存的逻辑。大部分参考书都会用类似于楼房的图形来表示内存。在这个楼房中,1层可以存储1字节的数据,楼层号表示的就是地址。内存为1KB时,如图所示
如何高效的使用内存呢?数组就是基础。数组是指多个同样数据类型的数据在内存中连续排列的形式。作为数组元素的各个数据就通过连续的编号被区分开来,这个编号称为索引。指定索引后,就可以对索引所对应地址的内存进行读写操作。而索引和内存地址的变换工作则是由编译器自动实现。数组的定义中所指定的数据类型,也表示一次能够读取的内存大小。char类型的数组 以1个字节为单位对内存进行读写,而short类型和long类型的数组则分别以2个字节、4个字节为单位对内存进行读写。数组是使用内存的基础。