上节提到过,变量就像书架上的标签,书架上的书就是数据,书架上可以放很多书,32开本的,16开本的,8开本的,等等等等,开本越大需要的书架空间越大。电脑的内存就像是书架,里面存放着各种数据,有文件,有图像,有录音,有视频,有游戏等等,但我们可以把这些数据细分再细分,分到最基本的单元,就是0和1。也就是阴和阳。两仪生四象,四象生八卦,八卦生六十四卦,以至于无穷,无穷到除了算命先生之外谁也看不懂。计算机也是同样的道理,计算机最初也是用纸带进行数据存储的,纸条打孔代表1,不打孔代表2,但随着技术的发展,内存条的出现淘汰了纸带,内存空间越来越大,单纯看0和1已经发展到谁也看不懂的地步了,不过原理是一样的。我们拆开计算机主板上插的内存条,里面有许多的整齐排列的电容(当然不止是电容),给电容充电相当于给纸带打孔,电容充电就代表1,放电就代表0。但几十万上百万甚至上亿的0和1的组合除了计算机自己已经谁也理解不了了。为了人类的方便,我们把一个小电容叫一个“位”,然后把八个“位”打包组成一个整体,叫字节,一大堆字节以特定规则排列起来,就是内存了。如果难以理解,就去找一个算盘看看,一个珠子就是一个“位”,用竹签子串起来的一串珠子就是一个字节。一个字节对应一个地址,就像是大楼房间外的门牌号,也像书架的书架号,学名叫地址(address)。这是内存条生产的时候就标好了的。这就是内存的基本结构。
能往内存中放的基本数据有2种,一种是整数类型,也就是整数;一种是浮点型,也就是小数。(也有的书把字符型单列出来的。)因为整数可以直接转化成二进制数,而小数要分成三部分——整数部分、小数点、小数部分,所以整数和小数在内存中的存储方式是不一样的,电脑更喜欢处理整数,对于小数来说,处理的过程中会出现一些失真,失真的原因是数学问题,这里不深入谈。
整型再分可以分成枚举型 enum(关键字中出现过,代表有限集合);字符型char(对的,我们看到的文字在电脑里都是整数。)整型 int;字符型用一个字节,可以表达256个整数数字。即2^8(2的8次方),如果是无符号数(不含正负号),取值范围为0-255,如果是有符号数,取值范围为-127——+127,它可以参与计算,但一般不用它计算,它的用处是存储字符。int(short)用两个字节,存2^16个数,long占4个字节(64位计算机的话可能占8个字节)。它能存多大的数,取决于它占用的字节数——当然,不是无限的,计算机没有无限这个概念,它理解不了无限,如果你想保存的数据超过了它所能表达的数,电脑就会出错,也就是出现传说中的八阿哥(bug)。
浮点型分三种,float(取值范围为-3.4*10^38~+3.4*10^38,即3.4*10的-38次幂 ——3.4*10的38次幂);double(-1.7*10^-308~1.7*10^308);long double(-1.2*10^-4932~1.2*10^4932),取值范围可以说很大了,需要用大数的话就用浮点型。
此外还有指针型*,指针型是一种特殊的整型,它存储的数据代表数据存放的位置在内存中的地址。
数组型,也就是给一组整型或者浮点型打包。
结构体型struct,也就是给一堆各种各样的数据类型打包。
我们住酒店的时候会说,给我一个单间,或给我们一个双人间。我们在申请变量的时候,基实就是向内存说:给我一个XX型变量所能用的字节空间。这是一样的。
这一节没有代码,只谈一些理论,具体内容以后再结合代码细说。