C++程序设计从零开始之何谓变量

C++程序设计从零开始之何谓变量,第1张

C++程序设计从零开始之何谓变量,第2张

这个描述是C++中的关键,大部分人都很困惑,但它是编程的基础,所以必须详细解释。

数字表示

在数学中,数只是数值大小的不同,永远不会有数值占有率空的区别,也就是说,数在数学中是一个逻辑概念,而计算机不是。考虑算盘。每个算盘上都有很多列运算符,每列又分上下两排运算符。上面有两个行操作符,每个代表5,下面有四个行操作符,每个代表1(这并不重要)。所以算盘每列有6个算符,每列可以代表从0到14的15个数字(因为上排算符的可能状态有0到2个算符,下排算符有0到4个算符,所以是3×5=15个组合)。

以上的观点是,算盘的每一列并不是代表从0到14的15个数字,而是每一列有15种状态,所以只用来代表数字(这一点很重要)。由于算盘每列有15个状态,所以用两个列运算符就可能有15×15=225个状态,所以可以表示0到224。阿拉伯数字的每一位都有从0到9的10个图形符号。当使用两个阿拉伯数字图形符号时,它可以有10×10=100个状态,因此可以表示从0到99的100个数字。

这里的算盘实际上是基于十进制的计数器(通过维护一列运算符的状态可以记录一个数字)。它的运算符列相当于一个阿拉伯数字,每列有15个状态,所以可以表示从0到14的15个数字。超过14位后,必须通过进位添加另一列运算符来表示数字。像这样的计算机,不是数字计算机,而是电子计算机,其中数字是用线的电势来表示的。一条线上只有两种电位状态——高电位和低电位,所以计算机的数字表示是二进制的。

和上面的算盘一样,一根线只有两种状态。当要表示一个超过1的数时,必须进位要求另加一根线来表示该数。所谓32位计算机,提供了32条线(称为数据总线)来表示数据,所以有2的32次方之多的状态。16行可以代表2的16次方个状态。
所以,计算机不是基于二进制数,而是基于状态的变化,只不过这个状态可以用二进制数来表示。也就是计算机不认识二进制数,这是后面“类型”一节的基础。

内存储器

内存是计算机中可以记录数字的硬件,但它的存储速度很快(相对于硬盘等低速存储设备而言)并且不能长时间保存数据,所以经常被用作草稿纸来记录一些临时信息。

如前所述,32位计算机的数字是由32行上的电位状态的组合来表示的,因此存储器可以记录该数字,即可以保持32行上各自的电位状态(就像算盘的操作者在被拨动后不会改变位置一样,除非再次被拨动)。不过,还是考虑一下上面的算盘。如果一个算盘上有15列算符,一个算盘可以代表15个状态的15次方,这是一个很大的数字。但是,往往不可能用这么大的数字。因此,如果一个算盘只有两列运算符,它只能代表225种状态。当数字超过时,会用另一个或更多的算盘一起表示。

上面的2列运算符和15列运算符都是算盘的粒度。粒度太大会造成不必要的浪费(很多列操作符都不用),太小又麻烦(需要多个算盘)。电脑也一样。能用2的32次方表示的数很大,一般不用。如果直接存储在32位的内存中,必然会造成相当大的资源浪费。如上所述,内存的粒度定义为8位二进制数,称为一个内存单元,其大小称为一个字节。也就是说,存储器存储数字时,至少会记录8行上的潜在状态,即2的8次方共有256种状态。所以如果要在内存中存储一个32位的二进制数,需要占用4个内存单元,也就是4个字节的内存空。

我们在纸上写字的时候,通过肉眼判断纸上单词的相对横坐标和纵坐标,找到要读的单词或者要写的位置。同样,因为内存相当于草稿纸,所以也需要某种定位方法来定位。在计算机中,它由一个数字来定位。就像酒店房间号一样,记忆单元相当于一个房间(假设每个房间只能住一个人),前面提到的数字相当于房间号。为了将数据写入某个存储器(也就是用某个存储器记录数据总线上的电位状态),需要知道这个存储器对应的编号,这个编号叫做地址。通过给定的地址找到相应的存储单元称为寻址。

因此,地址是一个标识特定存储单元的数字。这个数一般是32位长的二进制数,也就是说可以代表4G状态。也就是说,一般32位电脑都有4G内存空寻址能力,也就是电脑最多能装4G内存。如果电脑内存超过4G,就要增加地址长度,比如40位长的二进制数。

类型

在本系列的开头,我们已经解释了什么是编程,只是进一步解释了计算机其实连数字都不知道,只是记录状态而已,而所谓的加法,只是人为设计的加法器,使加法器处理两个状态产生的状态与数学加法的结果一样而已。这一切只说明一件事:计算机做什么取决于用户认为它是什么。

所以为了利用计算机的快速“计算”能力(实际上是改变状态的能力),人为规定了如何解释那些状态。为了方便起见,在此期间,我们用1位二进制数来表示上面提到的势的状态,那么上面提到的状态就可以用一个二进制数来表示,所谓的“如何解释那些状态”就变成了如何解释一个二进制数。

C++是一种高级语言。为了帮助解释这些二进制数,提供了类型的概念。类型是关于如何在内存中解释二进制数的人为协议。C++在下面提供了一些标准的类型定义。

有符号char表示指向的内存中的数是补码形式,表示的数是-128到+127,长度为1字节。

unsigned char表示指向的内存中的数字是原始代码形式,表示的数字是0到255,长度为1个字节。

SignedShort表示所指向的内存中的数是补数的形式,所表示的数是–32768到+32767,长度为2字节。

unsigned short表示指向的内存中的数字是原始代码形式,表示的数字是0到65535,长度为2个字节。

有符号long表示指向的内存中的数字是补码形式,数字为-2147483648到+2147483647,长度为4个字节。

unsigned long表示指向的内存中的数字是原始代码形式,表示的数字是0到4294967295,长度为4个字节。

有符号int表示指向的内存中的数是补码形式,表示的数取决于编译器。如果编译时指定编译器运行在16位操作系统上,就相当于带符号的short;如果编译成32位,相当于有符号long;如果编译运行在64位操作系统上,那么它的长度是8个字节,范围可以如上自行计算。

unsigned int表示所指向的内存中的数是原始代码形式,其余的和signed int一样,表示无符号数。

bool表示所指向的内存中的数字是一个逻辑值,该值为假或真。长度为1个字节。

float是指指向的内存按照IEEE标准解释,是real*4,占用4字节内存空,相当于上一篇文章提到的单精度浮点数。

double表示指向的内存是按照IEEE标准解释的,是real*8。可表示数的精度比float高,占用内存8字节空,相当于上一篇文章提到的双精度浮点数。

长double表示指向的内存是按照IEEE标准解释的,是real*10,可表示数的精度比double高。但是在为32位Windows操作系统编程时,仍然占用8字节内存空,相当于double,但是如果CPU支持这种浮点类型,仍然可以计算出这个精度。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » C++程序设计从零开始之何谓变量

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情