三、整理一下房间,准备开始崭新的生活吧。
刚开始读这篇帖子的时候,也许你会觉得计算机很好懂嘛!然后在第二段发现我竟然还要学习《组合数学》、《离散数学》……之类的鬼东西。这还没完,接着你又被一大堆概念搞得头昏脑胀,想放弃的时候却陡然间发现自己又长进了不少。以前总觉得魔术师好神奇,从礼帽里能拉出一只兔子。长大后发现自己的眼睛还是太年轻太幼稚了。以前总觉得计算机说不出来的有趣。玩游戏就如同看一场魔术表演。不知不觉中我们自己也变成了一位魔术师。可是,我们都知道我们的水平距离丹尼斯里奇这样的大卫科波菲尔或是约翰卡马克这样的胡迪尼还差很远。那么大家一起努力吧,计算机的世界永无止境。
接下来我还是用第一段中的例子来说明32位和64位操作系统的区别。如果32位整数是5毛钱硬币,64位整数是一元钱硬币。那么如果你的钱包是圆柱形的并且直径等于5毛钱硬币,那你就只能接受5毛硬币的找零。如果你的圆柱体钱包能放得下一枚一元硬币,那么一定也能放得下5毛的硬币。因为5毛钱硬币的直径比一元钱硬币的直径小。你的圆柱形钱包就是CPU总线。一个硬币就是一个整数的大小。所以32位OS只能运行32位APP。而64位OS不仅可以运行64位APP还能运行32位APP,却不能运行128位APP。每天你都需要工作和买东西,钱包内的资金也在不断流入流出。作为OS的你只需要负责收支平衡即可。在C语言中各种变量类型代表着各种长度的整数。大致说来,在32位C语言编译器下。char是一个byte;short int 是一个word;int是一个dword;long也是一个dword;而long long 就是一个qword。此时的byte是8位整数,word是16位整数,dword是32位整数……以此类推。在64位C语言编译器下:char还是一个byte;short int也是一个word; int 同样是一个dword。而64位的Visual C/C++编译器中(VC 2010为例)long int 是dword; long long 却是qword。与之有别:64位gnu C/C++编译器中 long long 和 long 都是一个qword(我所用的OSX平台 Xcode 8.x下是这样的情况。)至于浮点数,我前面说过计算机内所有浮点数均可以用整数表示,欲知详情请参见:https://www.0xaa55.com/forum.php?mod=viewthread&tid=462
浮点数的规矩是IEEE制定,float和double不管位于哪个平台下均分别为:32位和64位。唯一不一样的是long double。因为VC 2010和我所使用的gcc 4.2.1所支持的IEEE标准不一样,VC下long double是64位, 我的gcc下long double是128位。如果你在嵌入式平台上开发,那么使用C编译器之前一定要查看手册。因为这些平台特殊不仅支持的IEEE标准不一样,有的时候连ANSI/ISO C标准也不能很好支持。ANSI/ISO C标准下定义整数长度的头文件分别位于 stdint.h 于stddef.h 中。我们都是老司机,才不会发生不处理的溢出呢!