收藏 分享(赏)

编程摇篮的C++Builder 6教程.doc

上传人:gnk289057 文档编号:9629021 上传时间:2019-08-19 格式:DOC 页数:154 大小:2.05MB
下载 相关 举报
编程摇篮的C++Builder 6教程.doc_第1页
第1页 / 共154页
编程摇篮的C++Builder 6教程.doc_第2页
第2页 / 共154页
编程摇篮的C++Builder 6教程.doc_第3页
第3页 / 共154页
编程摇篮的C++Builder 6教程.doc_第4页
第4页 / 共154页
编程摇篮的C++Builder 6教程.doc_第5页
第5页 / 共154页
点击查看更多>>
资源描述

1、C+Builder的基本功能我们用高级语言写程序,我们很得意,因为高级语言比较接近人类的语言,使我们用起来得心应手,所以我们当然得意。但我们更得意的一定是让程序代码赶快变成可执行文件。无论是在写代码的过程,还是最后要编译成可执行文件,都需要有一个工具存在。这一工具一般称为编程集成环境(IDE) 。之所以称为集成,是因为从写代码到最后软件的出炉,我们需要它的地方实在太多了,这里列出其中最重要的功能项。1、代码编辑:方便的代码编辑功能。尽管你可以使用记事本、Word 或其它任何文本编辑器来写代码,但除非特殊需要,否则那将是极为低效的方法。相反,现在的编程集成环境,都相当的智能,举例如:代码自动功能

2、,可以在很多情况下自动完成我们所需的代码,既准确还迅速。Borland 公司出品的编程集成环境不仅有常见的关键字高亮等功能,还支持代码模板,支持键盘宏,同样支持高级的脚本插件功能。2、界面设计:可视化的程序界面设计功能。你所要产生的窗口,在设计期间就真实地出现,包括字体、颜色和定位。比如:你不仅可以插入 falsh 的动画,而且无需运行,就直接可以在你的界面上看到该动画的演播,这是别的编程环境不能做到的。3、程序编译:这是编程工具的主要功能。我们写的代码在成为机器能懂的可执行程序时,必须通过编译。4、程序调试:如何尽量减少你程序的 BUG 呢?没有编程集成环境提供的强大调试功能,我们做的程序将

3、毫无质量保证。5、代码优化:Borland 提供的编译器,不仅在编译速度上一直在美国屡获大奖,而且其代码自动优化功能一直领先对手几近一个时代。使用编程集成环境,我们可以轻松获得更快更优的最终可执行程序文件。6、辅助程序安装:程序的安装已属于另外一种工具的范畴,但我们仍可以通过编程集成环境来决定最终生成单一可执行文件,还是带有其它动态库。如果是后者,我们还可以通过集成环境来检查程序运行时调用了哪些动态库文件。C+Builder 提供的功能远不止我上面所说的,并不是因为我嘴笨,而是我认为对一个工具,你只有动手使用,才会真正了解它。C+ 是一门语言,而 Borland C+Builder 则是语言实

4、现工具。作为一个编程工具,CB 提供以上功能正是份内之事。在这个意义上,你可以认为 CB 是 Word2000,而 C+则是英语或汉语。正如我们用英语或汉语在 Word2000 上写出优美文章,编程可说为:我们用 C+语言在 CB 上编写出优美的程序。VCL vs. MFC 在作为一种编程工具的意义上,我们认为 C+Builder 和你也许常听的 VC(Visual C+)没有什么本质的区别。就像 Word2000 和 WPS2000 在本质都是字处理软件。但现在我们要从另外一个角度讨论 C+ Builde 这个编程工具。这个角度就是“封装”面向对象编程思想中的最重要也是最基础的概念。一个要学

5、习编程的人,可能从 C 开始学起。学 C 时,我们没有接触那些挺玄的概念,到了 C+,一切就来了,什么面向对象,什么封装、继承、多态于是我们兴奋起来,努力去理解、掌握,运用这些概念所代表的技术,在掌握这些别人暂时未能理解的概念之后而颇有成就感。现在我要问的是,为什么要有这些概念?这些技术?正确回答这个问题,不仅有助于我们今后对编程语言各种概念的学习,而且它能让我们避免成为新技术的奴隶,这一切也许听起来有些形而上,不过我想通过以下讨论,至少可以回答一个很现实的问题:为什么要选 C+Builder?而不是我们更常听的 VC?这是我碰到的编程初学者较疑惑的问题之一。如果人类长有翅膀,那么飞机大抵永远

6、不会被发明。飞机的发明,是为了弥补人类自已不能飞翔的缺陷。不能说所有的技术都是这样,但 C+对于 C 的发展,完全是为弥补程序员脑力的不足。一个在校生在学会 C 后,往往并没有机会用 C 去实践一个大中型的项目,体会不到在一个庞大软件工程中,非面向对象语言的短处,所以在之后学习 C+的过程中,也就很难真正体会到面向对象语言的长处。简短一点说:不知道 C的短处,就不懂 C+的长处。相反,倒是很快就发现 C+的缺点:它的代码效率多数情况下都要比 C 低不少。前面我们说过低级语言与高级语言的对比,C+语言也正是从语法结构和语言功能上来限定或实现一门编程语言更加接近人在现实生活中的思维习惯,从而达到减

7、轻人的记忆和判断上的负担。这其中最佳的方法之一就是所谓的“封装” 。VC 的封装类库称为 MFC,它是一种很低阶的封装,它并没有按照人类的思维习惯来重新组织和解释 Windows 对象(指 Windows 编程中所需的数据,处理,机制,接口) ,而纯粹是 API 一对一的翻版。这样的封装工作带来代码封装所固有的代码效率降低的副作用,却没有给使用者带来任何方便。如果你是编程初学者,而你身边又有 VC 高手,那么你一定要多多向他学习请教,因为一个真正的 VC 编程高手,其同时一定也是一个深刻理解 Windows 内核机制(消息循环,内存管理,多任务实现,资源使用等) ,熟悉Windows 各种常用

8、 API 函数等等的高手。C+Builder 对封装库称为 VCL(带 VC 字样,可别以为它是 Visual C+,其实它是:Visual Component Library,即:可视控件库)。VC 的 MFC 和 CB 的 VCL 都是基于(但不限于)对 Windows API(应用程序接口函数)的封装,为什么要对 API 进行封装?这就是回到了我们前面说过的,为什么有了 C 又会有 C+的问题。因为操作系统是用 C 和汇编写成的,它获得到操作系统必须的代码效率,但对应用程序开发者而言,它失去了易用性。所以微软和 Borland 都使用高级语言对之进行封装工作。二者谁进行得更好呢?要想成为

9、 Windows 编程高手,最终一定要绕过各种封装,理解 Windows 对象。但作为一个初学者,我们必须挑选一个好的封装。下面我们举字体(Font)作为例子,将三者:没有封装过的 Windows 字体 API、封装过的 MFC 字体对象和封装过的 VCL 字体对象做一个对比。为了保证不会有偏倚和差错,有关前二者的代码,都是笔者从MSDN(微软提供的帮助文档)中直接拷贝出来。Window APIWindows API 创建指定样式字体: HFONT CreateFont(int nHeight, / height of font int nWidth, / average character

10、width int nEscapement, / angle of escapement int nOrientation, / base-line orientation angle int fnWeight, / font weight DWORD fdwItalic, / italic attribute option DWORD fdwUnderline, / underline attribute option DWORD fdwStrikeOut, / strikeout attribute option DWORD fdwCharSet, / character set iden

11、tifier DWORD fdwOutputPrecision, / output precision DWORD fdwClipPrecision, / clipping precision DWORD fdwQuality, / output quality DWORD fdwPitchAndFamily, / pitch and family LPCTSTR lpszFace / typeface name);MFC(Visual C+)将 HFONT 封装为 CFont BOOL CFont:CreateFont (int nHeight,int nWidth,int nEscapem

12、ent,int nOrientation,int nWeight,BYTE bItalic,BYTE bUnderline,BYTE cStrikeOut,BYTE nCharSet, BYTE nOutPrecision, BYTE nClipPrecision, BYTE nQuality, BYTE nPitchAndFamily,LPCTSTR lpszFacename );VCL(C+Builder)将 HFONT 封装为 TFont1 要设置字体名,高度,尺寸等使用以下代码:Font-Name = “宋体”; /设置为宋体Font-Size = 24; /设置尺寸为 24 号 2将

13、字体的粗,斜,下划线,删除线再封装为 TFontStyle 属性:Font-Style = Font-Style #pragma hdrstop/-#pragma argsusedint main(int argc, char* argv)printf(“Hello,world!“);getchar();return 0;/-这是一个很短的程序,我们稍微做点解说:如果作一个大的程序,代码一多自已都会看晕,所以就需要在代码中加一些注释,用以解说某行或某段代码的用途,或者用以让代码显得清晰。C+中,常用双斜杠 “/”开始,一直到该行结束的内容来代表注释。上面的代码中,有三行:/-这正是用来从视觉上

14、分隔代码的注释。注释对程序的运行没有任何影响,其作用只用来给人看的。当编译器编译进,它会过滤掉所的有注释内容。#pragma hdrstop 和#pragma argsused 两行为编译预处理命令,当编译器在编译本段代码,预处理命令会影响编译的某些行为。#include 是我们新加的一行,stdio.h 是一个文件的名字,扩展名是.h。h是 head 的意思,所以被称为头文件。这个文件在哪里呢?在你的机器里,在C+Builder 安装后的文件夹内的某个子文件夹内;在这个文件夹内,C+Builder 为我们提供了上千个头文件。头文件起什么作用呢?C+Builder 为我们提供了函数库(RTL

15、/runtime library)和类库(VCL);而Windows 操作系统(Windows 用 C 写成)则向我们提供了 API 函数库。 “库”是“储存”大量实用的解决各种问题,实现各种功能的“工具”的地方,它们都通过头文件列出清单。当我们写上#include 这一行时,我们是在向编译器说明:本文件中的程序需要用到 stdio.h 头文件中所列的某些函数;“include”正是包含之意。printf(“Hello,world!“);getchar();printft 和 getchar 正是两个在 stdio.h 中列出来的函数。如果没有#include 这一行,编译器便会报错说不认识这

16、两个符号。换句话说,include 语句让编译器知道我们要用的库函数在哪一个库里。我们会在下一节“简单程序调试”中做相应试验。Print 是打印之意,而 f 则为 format,二者结合意为“有格式地打印” 。我们的Hello World 不需要任何格式。至于 getchar 从字面上理解是“得到字符” ,事实上就是程序会在此处停下来,等待用户输入字符,直到输入一个回车符,程序继续执行。在我们的这个程序里,继续执行的结果是碰上这一行:return 0;return 的意思是返回,当主函数 main 返回时,整个程序就结束了。所以,使用这个 getchar()的目的很明显:让程序在结束之前可以等

17、我们一下(因为我们需要看一眼输出的“Hello World”) 。Printf 的作用是输出(output)内容,而 getchar()则是等待你输入,从这一点看,我们也可以理解前面 include 为什么是 stdio.h 了。std 是英文标准的前三个字符,而 I 和 O分别是 input 和 output 的首字母。说了很长,但程序运行结果却很简单,这是按 F9 后的运行结果: 按回车结束程序。结束后,别忘了保存我们的第二个程序。四、简单程序调试:1、编译期错误与运行期错误:如果我在上面的程序输出时,打出的字幕不是“Hello,world” ,而是“Hello,word” 。你一定会说“

18、哎,哥们,程序错了!” 。于是,我就要去代码中查找有关输出的那一句,一看,哟,真少写了一个l 。将这一错吴改正,重新运行,检查结果。这就是一个调试过程,发现错误;查找出错原因;改正;再运行。当然,由于很多时候我们也不是非要等到发现错误了才去检查,有时我们会主动一步步去事先主动检查是否有错。必竟 BUG 总是常见的。程序错误(BUG)表现上各式各样,但若是从其“发作”的时间上分,则可分为“编译期错误”和“运行期错误” 。如果上面说的错误属于后者,因为它对编译过程并不产生什么阻碍,编译可以通过,错误将在运行中表现出来(按时间分还有一种称为“链接期错误” ,这里不说) 。在上一节的代码中,我们来故意

19、制造一个编译期的 BUG,我们故意将最后一句代码:return 0; 行末的分号 “;”删除,代码如下:int main(int argc, char* argv)printf(“Hello,world!“);getchar();return 0 /根据约定,我们用粗斜体表示修改过的代码写好代码后按 F9,程序并没有跑起来。但在代码编器窗口下面,出现一消息框(如果你没有发现,请在代码窗口中点鼠标右键,将出现右键菜单,选:Message View 项) 。编译过程是一个相当复杂的过程,在编译之前,代码会被做很多格式上的转换,人写代码出错的原因也五花八门,所以想让编译器判断到底你犯了什么错吴事实上

20、是很难的,但 CB 的编译出错消息仍竭尽全力让我们找到出错原因:C+ Error:错误类型;这是在告诉我们,这是一个 C+语言语法方面的错误。编译器说对了,因为我们少写一个分号,确实是犯了 C+语法错误。Unit.cpp(13):错误位置;说的是在 Unit.cpp 这个文件内的第 13 行,出错的文件显然是说对了,但行数却稍有偏差,少了分号的那行其实是第 12 行,从状态栏可以看到当前光标位置的行列数。E2378:错误编号,CB 对各错误消息进行了编号。Return statement missing;错误消息;在这里这个消息完全正确, “return”语句丢了分号。在使用中,并不是每回都能

21、幸运得到这样准确的错误报告和消息。比如,同样是去掉分号,但这回是把 return 0 一句的分号补上,转而去掉 printf(“Hello world!”)这一行的分号,编译出错消息是这样:错误消息说我们调用了一个“非函数” ,为什么呢?答案是因为没有了分号,编译将两句连成一句:printf(“ Helo,world!”)getchar();这样,它就把 printf(“Helo,world!”)getchar 整个儿认为是一个函数名,于是就不认识它了。下面我们做一个实验,结果报错也同样为“Call of nonfunction”,但原因不是我们写错了函数名,而是我们使用了库函数,只是没有通过

22、 include 语句来告诉编译器:这些函数在哪个库里。/-/#include #pragma hdrstop/-#pragma argsusedint main(int argc, char* argv)printf(“Hello,world!“);getchar();return 0;/-代码中,我们故意用“/”将#include 从一行代码摇身一变成为一行注释,前面说过注释是仅给人看的,编译看不到这一行,相当于这一行被删除了;现在编译这一行,错误提示如下:两行同样类型的错误消息,编译器一下子不认识 printf 和 getchar 两个函数了。五、学会使用帮助文档:经过上一节,同学可能会

23、问三个问题:第一:怎么知道有 printf 和 getchar 这个两个函数呢?回答:有两个途径,常用的函数会在课程里讲到,其它函数则根据需要在帮助文档中查找。第二:怎么会知道 printf 是用来输出,而 getchar 则可以用于等待输入?回答:和上面一致,从课程和帮助文档中获得。第三:就算知道了 printf 这个函数,又怎么才能知道它在 stdio 这个头文件对应的库里?回答还是一样。学会使用帮助文档很重要,文档有多种,比如有专门的函数大全之类的书,不过现在的文档是帮助文档。初学者在调试程序时,很多人由于英文不佳,于是根本不去动帮助文档。其实当你带些具体的目的去看帮助文档,你会发现就算

24、英文不好,也可以从中获得帮助,解决大部分程序问题。我们用一节的那个 BUG 来说明问题。假如你用了 printf 和 getchar 这两个函数,但你不知它们包含在哪个库里(也就是说你不知道在#include 之后应该写“stdio.h ”) ,可以这样作:依次点击菜单:Help | C+Builder Help。在出现的 Windows 标准的帮助索引窗口中的索引行内键入:printf 回车。找到的有关 printf 的帮助如下一页的图示:提高英语水平对学习编程的帮助是很大的。数据类型的基本概念一、数据类型: 在计算机编程世界中,有哪些基本的数据类型?在人类世界里,数据类型很多,把人类的对万

25、物划分类型的方法照搬入计算机世界,显然不可能,怎么办呢?方法就是:抽象。计算机先哲们为我们做了这一切;其中最重要的类型也称为“C 和 C+语言的基本数据类型” ,只有两个:“数值” 和“字符”。现实生活中,数字被广泛地应用在两种不同的范畴;其一:是那些典型的,需要进行计算的场合;其二,则是那些只用来表示符号的范畴。比如电话号码和车牌号,把两个电话号码进行相加或相减的操作是没有意义的。基于数字的两种完全不一样的使用范畴在被抽象到计算机程序语言时,数字被分到“数值” 和“字符”两种类型中;但字符类型并不只有阿拉伯数字,键盘上的字母符号,都属于字符类型。在 C 和 C+中, “字符类型”其实也可归入

26、数值类型。在某些情况下,它仍然会被用来参与计算。比如在计算机中,字符A加 1 后,会得到下一个字符 B,这种操作符合我们的习惯。二、整型和实型:数值类型又被分为“ 整型”和“实型”。整型就是不带小数位的数,而实型则是指带小数位的数,也称为“ 浮点数” 。我们在生活中一般并不做如此区分。譬如说鸡蛋的价格罢,今儿便宜了,一斤 2 块整,但这不防碍明儿价涨了,我们说成:涨了,2.30 元一斤。在编程时可不能这样,你必须事先考虑到鸡蛋的价格是必须带小数的,就算现在是 2块整,也得将价格定为实型,否则,涨成 2 块 3 时,计算机会把那 0.3 元给丢了,还是变成 2 元整。你也许会问,为什么不直接就定

27、一个实型就好呢?实型不就包含了整型的值吗(如 2.0 等于 2 元)?回答很简单:因为在计算机里,对整数的运算要远远快于对浮点数的运算,所以,在人类的思维习惯与计算机特点之间,必须做一个折衷。折衷的结果就是虽然都是数值类型,但程序员在写程序时,必须事先想好,哪些数据是必须带小数计算的,那些数据定为实型较好,比如工资,没有哪个员工会认为老板可以将自已工资中的小数位忽略不计;而那些可以不用,或者可以不计较小数的数值,则被建议设计成整型,比如人的年纪,虽然可以,但我们很少需要有类似 1.6 岁这种说法。想想,假如一位女士说自已 28 岁,而你却立刻纠正她:“不,准确地说,您已经 28.7 岁了”结局

28、会怎样呢?为了那 0.7 岁,不仅你的程序会跑得慢,而且会倍受女人的白眼杀伤。想想其实也很自然:工资必须设计成实型,而年龄虽然不是必须,但建议设计成整型。三、数值的范围:顾及计算机的运行速度,人(程序员)做出了妥协,必须对“整型” 或“实型”做出考虑。另一方面,和速度同样重要的是计算机的空间的考虑,它让程序员必须再做一步妥协。有时候,在计算机中你设置了一个数,当再住这个数加 1 时,真不幸,计算机会告诉你说:加 1 是加 1 了,可是结果变成 0,甚至是负数。这就是计算机的空间问题:任何一个量,都有一个大的上限,和小的下限,出了这个范围(比上限还大,比下限还小) ,就会称为溢出。这是一种物理的

29、现实,也是一种人为的规定。为什么要这样规定?原因是计算机的存储器,特别是其中很重要的内存,其可存储的数据多少总是有限度的(而且,同样大小数,2 进制的表达形式比 10 进制长得多) ,如果允许编程像生活中一样任何一个数都可以很大很大,也就是这个量表达起来将很长很长,那么存储器的空间就会很快用完!(无穷大就不用说了,因为不可能有无穷大的存储器) 。就是这样,数值类型在被划分为整型和实型后,将根据所占用的空间而被继续划分为几种不同的类型。而我们在考虑工资必须设计成带小数的实型后,必须再面对一个设计上的考虑,工资这个量在程序里要占多大空间?依据其实很简单,就看你的单位最高月薪是多少,凭此找到一个合适

30、的类型。比如月薪不超过 1 万元,那我们选择一个刚刚可以包含 10000 的数据类型。两种基础类型:数值类型和字符类型,前者说了很多,现在我们也来对字符类型做一些附加说明。字符类型要比数值类型简单得多,它不能带小数,所以没有整型实型之说;它占用 1 个字节,已经是计算机能单独处理的最小空间单位,所以也不存在继续分为不同空间长度的问题,所以我们将以它为例,详细说明有关数据类型的一些基本而重要的概念。第一:由于计算机和编程都是老外的发明,而老外生活中常用的字符并不多(主要是阿拉伯数字、英文字母、标点符号等) ,所以字符的宽度被定为 1 个字节。1 字节 = 8 位,所以它能表示的最大数当然是 8

31、位都是 1(既然 2 进制的数只能是0 或 1,如果是我们常见的 10 进制,那就 8 位都为 9,这样说你该懂了?) 。1 字节的二进制数中的最大数是 11111111。无论是什么进制,都是左边是高位,右边是低位。第一章中我们说过,10 进制数的最低位(个)的权值是 100,第二位是 101,第三位是 102,用小学课本上的说法就是:个位上的数表示几个 1,十位上的数表示几个 10,百位上的数表示几个100二进制数则是:第 1 位数表示几个 1 (20) ,第 2 位数表示几个 2(21) ,第 3 位数表示几个 4(22) ,第 4 位数表示向个 8(23)在 C 和 C+中,很多计数的习

32、惯都是从 0 开始,所以在你看明白上面那些内容后,让我们立刻改口换成下面的说法,以后我们只用这种说法:二进制数:第 0 位数表示几个 1 (20) ,第 1 位数表示几个 2(21) ,第 3 位数表示几个 4(22) ,第 4 位数表示向个 8(23)按照这种说法,我们可以发现,从右向左数,第 n 位数的权值 = 2 的 n 次方。二进制各位权值的计算方法: 第 n 位权值 = 2n。下表详细地表示 2 进制数 11111111 是如何逐位计算,累加得到 10 进制的值:第几位 7 6 5 4 3 2 1 0权值 27=128 26=64 25=32 24=16 23=8 22=4 21=2

33、 20=12 进制 1 1 1 1 1 1 1 1合计10 进制 128 64 32 16 8 4 2 1 255上表表示了这么一个计算过程(*表示乘号):1 * 27 + 1 * 26 + 1 * 25 + 1 * 24 + 1 * 23 + 1 * 22 + 1 * 21 + 1* 20 = 255计算结果是:11111111(b) = 255 (d)(为了不互相混淆,我们在书中常用(b)来表示前面的数是 2 进制的,而(d)则表示该数是 10 进制数。同样地,另有 8 进制数用(o)表示,16 进制用(h)表示。不过记住了,这只是在书中使用,在程序中,另有一套表示方法。 )以前我们知道

34、1 个字节有 8 位,现在通过计算,我们又得知:1 个字节可以表达的最大的数是 255,也就是说表示 0255 这 256 个数。那么两个字节(双字节数)呢?双字节共 16 位 1111111111111111,这个数并不大,但长得有点眼晕。从现在起,我们要学会这样来表达二制数:1111 1111 1111 1111,即每 4 位隔一空格。双字节数最大值为:1 * 215 + 1 *214 + 1* 213 + 1 * 212 + 1 * 211 + 1 * 210 + + 1 * 22 + 1 * 21 + 1* 20 = 65535很自然的,我们可以想到,一种数据类型允许的最大值,和它的位

35、数有关。n 位二进制数的最大值:1 * 2(n-1) + 1 * 2(n-2) + . + 1 * 20任何一种基本数据类型,都有其范围。比如字符类型,它的最大值是 255,那么当一个数在其类型的范围已经是最大值时,如果再往上加 1,就会造成“溢出” 。其实,有限定范围的数量并不只在计算机中出现,钟表就是一个例子;10 点再加1 点是 11 点,再加 1 点是 12 点,可是再加 1 点,就又回到 1 点。再如汽车的行程表,假设最多只能显示 99999 公里,当达到最高值后继续行驶,行程表就会显示为 00000公里。四、有符号数和无符号数:回头看上一节,我们所讲的数都是正数。同样是年纪和工资,

36、前者不需要有负值,但后者可能需要。那么,负数在计算机中如何表示呢?关于这一点,你可能听过两种不同的回答。一种是教科书,它会告诉你:计算机用“补码” 表示负数。可是有关 “补码”的概念一说就得一节课,这一些我们需要在第 6 章中用一章的篇幅讲 2 进制的一切;再者,用“补码”表示负数,其实只是说出一种公式,公式的作用在于告诉你,想得到问题的答案,应该如何计算。却并没有告诉你为什么用这个公式就可以得到答案?另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高位是 0,表示正数,最高位是 1,表示负数。这种说法本身没错,可是如果没有下文,那么它就是错的。至少它不能解释出,为什么字符类型的-1

37、 用二进制表示是“1111 1111”(16 进制为FF);而不是我们更能理解的 “1000 0001”(为什么说后者更好理解呢?因为既然说最高位是 1 时表示负数,那 1000 0001 不是正好是-1 吗?) 。关于这一点,让我们从头说起。1、你自已决定是否需要有正负。就像我们必须决定某个量使用整数还是实数,使用多大的范围的数一样,我们必须自已决定某个量是否需要正负。如果这个量不会有负值,那么我们可以定它为带正负的类型。在计算机中,可以区分正负的类型,称为有符类型,无正负的类型(只有正值):称为无符类型。数值类型分为整型或实型,其中整型又分为无符类型或有符类型,而实型则只有符类型。字符类型

38、也分为有符和无符类型。比如有两个量,年龄和库存,我们可以定前者为无符的字符类型,后者定为有符的整数类型。2、使用二制数中的最高位表示正负。首先得知道最高位是哪一位?1 个字节的类型,如字符类型,最高位是第 7 位;2个字节的数,最高位是第 15 位;4 个字节的数,最高位是第 31 位。不同长度的数值类型,其最高位也就不同,但总是最左边的那位(如下示意中的粗体字为最高位) 。字符类型固定是 1 个字节,所以最高位总是第 7 位。单字节数:1111 1111双字节数:1111 1111 1111 1111四字节数:1111 1111 1111 1111 1111 1111 1111 1111当我

39、们指定一个数量是无符号类型时,其最高位的 1 或 0 和其它位一样,用来表示该数的大小。当我们指定一个数量是无符号类型时,此时,最高数称为“符号位” 。为 1 时,表示该数为负值,为 0 时表示为正值。3、无符号数和有符号数的范围区别。无符号数中,所有的位都用于直接表示该值的大小,有符号数中最高位用于表示正负,所以,当为正值时,该数的最大值就会变小。我们举一个字节的数值对比:无符号数:1111 1111 值:255 1* 27 + 1* 26 + 1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20有符号数:0111 1111 值:127 1* 26 +

40、1* 25 + 1* 24 + 1* 23 + 1* 22 + 1* 21 + 1* 20同样是一个字节,无符号数的最大值是 255,而有符号数的最大值是 127。原因是有符号数中的最高位被挪去表示符号了。并且,我们知道,最高位的权值也是最高的(对于 1 字节数来说是 2 的 7 次方=128) ,所以仅仅少于一位,最大值一下子减半。有符号数的长处是可以表示负数。因此,虽然它的在最大值缩水了,却在负值的方向出现了伸展。我们仍以一个字节的数值对比:无符号数: 0 - 255有符号数: -128 - 0 - 127同样是一个字节,无符号的最小值是 0 ,而有符号数的最小值是 -128。所以二者能表

41、达的不同的数值的个数都一样是 256 个。只不过前者表达的是 0 到 255 这 256 个数,后者表达的是-128 到+127 这 256 个数。一个有符号的数据类型的最小值是如何计算出来的呢?有符号的数据类型的最大值的计算方法完全和无符号一样,只不过它少了一个最高位(见第 3 点) ;但在负值范围内,数值的计算方法不能直接使用 1* 26 + 1* 25 的公式进行转换。在计算机中,负数除为最高位为 1 以外,还采用补码形式进行表达。所以在计算其值前,需要对补码进行还原。这些内容我们将在第六章中的二进制知识中统一学习。这里,先直观地看一眼补码的形式:以我们原有的数学经验,在 10 进制中,

42、1 表示正 1;而加上负号,-1 则表示和 1相对的负值。那么,我们会很容易认为在 2 进制中(1 个字节): 0000 0001 表示正 1,则高位为 1 后:1000 0001 应该表示-1。然而,事实上计算机中的规定有些相反,请看下表:二进制值(1 字节) 十进制值1000 0000 -1281000 0001 -1271000 0010 -1261000 0011 -125. .1111 1110 -21111 1111 -1 首先我们看到,从-1 到-128,其二进制的最高位都是 1(表中标为红色) ,正如我们前面的学。然后我们有些奇怪地发现,1000 0000 并没有拿来表示 -0

43、;而 1000 0001 也不是拿来直观地表示-1。事实上,在计算机中-1 用 1111 1111 来表示。怎么理解这个问题呢?先得问一句是-1 大还是-128 大?当然是-1 大,-1 是最大的负整数。以此对应,计算机中无论是字符类型还是整数类型,也无论这个整数是几个字节。它都用全 1 来表示 -1。比如一个字节的数值中:1111 1111 表示 -1,那么,1111 1111 - 1 是什么呢?和现实中的计算结果完全一致。1111 1111 - 1 = 1111 1110,而 1111 1110 就是-2。这样一直减下去,当减到只剩最高位用于表示符号的 1 以外,其它低位全为 0 时,就是

44、最小的负值了,在一字节中,最小的负值是 1000 0000 即-128。我们以-1 为例,来看看不同字节数的整数中,如何表达-1 这个数:字节数 二进制值 十进制值单字节数 1111 1111 -1双字节数 1111 1111 1111 1111 -1四字节数 1111 1111 1111 1111 1111 1111 1111 1111 -1 可能有同学这时会混了,为什么 1111 1111 有时表示 255,有时又表示-1?所以我再强调一下本节前面所说的第 2 点:你自已决定一个数是有符号还是无符号的。写程序时,指定一个量是有符号的,那么当这个量的二进制各位上都是 1 时,它表示的数就是-

45、1 ;相反,如果事选声明这个量是无符号的,此时它表示的就是该量允许的最大值,对于一个字节的数来说,最大值就是 255。这一节课,看似罗嗦,但我希望每位没有编程基础,或者以前对进制,对负值、补码和反码等概念,对数据类型理解不透彻的学员,都能多花点时间反复阅读,直到看懂文中的每一张图表的意思为止。 五、字符集和保留字:字符集和保留并不专属于“数据类型” 的基础知识,它是一门语言最基础的东西,就像字母 A-Z 对于英语的作用一样,我把它放到这里,更多的是因为这是我们第一次要碰到它,在下一节中马上就要用上了。感觉上它的难度和学会 26 个字母差不了多少。字符集:每种语言都使用一组字符来构造有意义的语句

46、,组成 C+程序,最终是以下这些字符(空格这个字符不好表示,就直接写上“空格 ”两字了,以后同):26个字母的大小写形式:ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrst;10个阿拉伯数字:0123456789;其它符号:+ - * / = , . _ : ; ? “ | ! # % 为什么要给现成的数据类型起别名?当然这也是为了迁就我们为人类,就像我们给人家起绰号一样,形象好记,不易混淆。比如,我们在编程中需要使用一些年龄数据,应该使用整型(int)类型。另我们还使用到身高的数据,由于单位采用“厘米” ,所以也可能使用 int 类型。两种数据属于

47、同一数据类型,但所代表的内容却不容混淆。我们可以使用 typedef 来临时为 int 取两个别名:typedef int AGE;typedef int STATURE;通过以上两行话(行末都需要以分号结束) ,我们获得了两种新的数据类型名称。它们的一切属性都和其原名 int 的数据类型完全一致,只是名字变得有意义了一点而已。这里,为了说明问题举一个简单的例子, (事实上例子的情况并不值得使用 typedef来取别名)来说明 typedef 常用来为一些复杂的类型取一简单且意义明了的别名;比如定义函数的指针,在 C+ Builder 的控件编写中,更是有非常频繁地用 typedef 来为那些

48、定义复杂的事件函数(类成员函数的指针)取别名。sizeof的使用:用法: sizeof(数据类型)sizeof(变量)C 和 C+提供了关键字 sizeof,用于在程序中测试某一数据类型的占用多少字节。sizeof 有两种用法,效果一样。由于我们还没有学变量,所以我们先讲第一种。 sizeof 是一种计算,计算的对象是指定的一种数据类型,计算的结果是该数据类型占用的字节数目。如:sizeof(char) = 1;也就是说 char 类型占用 1 个字节。sizeof(int) = 4;也就是说 int 类型占用 4 个字节。使用 sizeof的例子:下面我们来完成一个实例,这个例子使用 sizeof 将我们已学的所有数据类型的名称所占用的字节数列出。首先,新建一个控制台工程,其余操作步骤如下:1、选择主菜单 File | Ne

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报