4.1这是个有类型的世界 4.2数据类型基本概念 4.2.1理解数据类型 4.2.2理解整型和实型 4.2.3理解数值的范围 4.2.4理解有符号数和无符号数 4.3字符集和保留字 4.3.1字符集 4.3.2保留字 4.4基本数据类型 4.4.1字符型和各种整型、实型 4.4.2布尔型(boo1)和无类型(void) 4.4.3为数据类型起别名: typedef 4.5 sizeof的使用 4.5.1 sizeof例程 4.1这是个有类型的世界 问大家一个问题 现实生活,有哪些信息可以用计算机可以管理呢? 职工、学员、客户、工资、原材料、产品、商品……现实中实现用计算机管理的信息已 是无数 职工又有什么信息呢? 职工有姓名、性别、出生年月、家庭住址、电话,婚否、工龄、工种、工资、等等 这两个问题你可能回答得不错,现在,考验你前几章有没有认真学习的时刻到了,请看 下面这个问题 所有的这些信息,在计算机里都是以什么样的数据形式来表达呢?请自觉闭上眼睛,想 一想。再看以下的各种回答
4.1 这是个有类型的世界 4.2 数据类型基本概念 4.2.1 理解数据类型 4.2.2 理解整型和实型 4.2.3 理解数值的范围 4.2.4 理解有符号数和无符号数 4.3 字符集和保留字 4.3.1 字符集 4.3.2 保留字 4.4 基本数据类型 4.4.1 字符型和各种整型、实型 4.4.2 布尔型(bool)和无类型(void) 4.4.3 为数据类型起别名:typedef 4.5 sizeof 的使用 4.5.1 sizeof 例程 4.1 这是个有类型的世界 问大家一个问题: 现实生活,有哪些信息可以用计算机可以管理呢? 职工、学员、客户、工资、原材料、产品、商品……现实中实现用计算机管理的信息已 是无数。 职工又有什么信息呢? 职工有姓名、性别、出生年月、家庭住址、电话,婚否、工龄、工种、工资、等等。 这两个问题你可能回答得不错,现在,考验你前几章有没有认真学习的时刻到了,请看 下面这个问题: 所有的这些信息,在计算机里都是以什么样的数据形式来表达呢?请自觉闭上眼睛,想 一想。再看以下的各种回答
“二进数”,正确 已数字化的数据”,也算正确 “0和1”,正确, “机器语言”,正确,你还记得第一章的内容啊,不错。 本章需要继续的一个问题就由此开始。所有的信息都用机器语言一一那些0和1——表 达,那你我编写程序岂不很难? 这是第一章的问题,你还记得在第一章关于本问题回答吗?那就是:机器语言不好记, 那就用高级语言。高级语言高级在哪里呢?第一章也有答案:就高级在它尽量向“高级动 物”的思维习惯做了一些接近。当然,只能说尽量,它必须仍然保持符合机器的绝大部分 特点,否则,大家就不要学计算机语言了 数据类型,就是计算机语言向人类语言靠近时,走出的第一步,很重要的一步。(机器 语言或汇编语里,没有数据类型一说。) 人类的世界,是有类型的世界 树木花草,归一类:植物 猪狗猫羊,动物 金银铜铁,金属 你我他她,人类。(不要告诉我你不是人类,在这虚拟的网络的世界…… 上一章笔者“鼓吹”过一个观点:整个世界都可以用数据和处理来表达。基于此,整个 世界就是一个程序:而万物是世界的数据。如果你找一个人,对他说:“你等于一只猪 他一定暴跳如雷。为什么呢?嘻嘻,学了这一章,我们就可以从程序的角度来解释了:人 和猪不是一类型,不适于做赋值操作。待以后我们学了C++的“类”,则又有更好回答:上 帝创造世界是,没有为人“类”实现参数为猪“类”的拷贝构造函数,或等号重载函数。 (想和上帝做同行?快做个程序员。) 4.2数据类型基本概念 4.2.1理解数据类型
“二进数”,正确。 “已数字化的数据”,也算正确。 “0 和 1”,正确。 “机器语言”,正确,你还记得第一章的内容啊,不错。 本章需要继续的一个问题就由此开始。所有的信息都用机器语言——那些 0 和 1——表 达,那你我编写程序岂不很难? 这是第一章的问题,你还记得在第一章关于本问题回答吗?那就是:机器语言不好记, 那就用高级语言。高级语言高级在哪里呢?第一章也有答案:就高级在它尽量向“高级动 物”的思维习惯做了一些接近。当然,只能说尽量,它必须仍然保持符合机器的绝大部分 特点,否则,大家就不要学计算机语言了。 数据类型,就是计算机语言向人类语言靠近时,走出的第一步,很重要的一步。(机器 语言或汇编语里,没有数据类型一说。) 人类的世界,是有类型的世界。 树木花草,归一类:植物; 猪狗猫羊,动物; 金银铜铁,金属; 你我他她,人类。(不要告诉我你不是人类,在这虚拟的网络的世界……) 上一章笔者“鼓吹”过一个观点:整个世界都可以用数据和处理来表达。基于此,整个 世界就是一个程序;而万物是世界的数据。如果你找一个人,对他说:“你等于一只猪”, 他一定暴跳如雷。为什么呢?嘻嘻,学了这一章,我们就可以从程序的角度来解释了:人 和猪不是一类型,不适于做赋值操作。待以后我们学了 C++的“类”,则又有更好回答:上 帝创造世界是,没有为人“类”实现参数为猪“类”的拷贝构造函数,或等号重载函数。 (想和上帝做同行?快做个程序员。) 4.2 数据类型基本概念 4.2.1 理解数据类型
“数据类型”就是这么一个很好理解的概念。我们的重点是了解在计算机编程世界中 有哪些基本的数据类型?在人类世界里,数据类型那就多了,把人类的对万物划分类型的 方法照搬入计算机世界,显然不可能。怎么办呢?方法就是:抽象。 计算机先哲们为我们做了这一切。其中,最重要类型,也称为C/C++语言的基本数据类 型,只有两个:“数值 第一是“数值类型”。这样,在职工的信息中,譬如年纪,工龄、工资就有了归属。你 现在需要暂时不将目光从屏幕前移开,想一想“数值类型”是一个多好的抽象结果!无论 进行任何信息管理,离开了“数”,还能管理什么? 第二是“字符类型”。像职工姓名或家庭住址,这些由字符类型的数据组成。你可能想 不到的还有,职工的电话号码010-1234567,这也是由字符类型数据组成。0、1、2、3不 是数字吗?应该属于上面的“数值”类型吧?嗯,你听我说:现实生活中,数字被广泛地 应用在两种不同范畴:其一是那些典型的,需要进行计算的场合。比如鸡蛋1斤2.3元: 其二则那些只用来表示符号的范畴。比如电话号码,比如车牌号。把两个电话号码进行相 加或相减的操作是没有意义的。基于数字的两种完全不一样的使用范畴,所以在被抽象到 计算机程序语言时,数字被分到“数值”和“字符”两种类型中。但字符类型并不只有阿 拉伯数字,键盘上的字母符号,都属于字符类型。 在C/C+中,“字符类型”其实也可归入数值类型。在某些情况下,它仍然会被用来参 与计算。比如在计算机中,字符‘A’加1后,会得到下一个字符‘B’,这种操作符合我 们的习惯 4.2.2理解整型和实型 数值类型又被分为“整型”和“实型”。整型就是不带小数位的数,而实型则是指带小 数位的数,也称为“浮点数”。我们在生活中一般并不做如此区分。譬如说鸡蛋的价格罢 今儿便宜了,一斤2块整,但这不防碍明儿价涨了,我们说成:涨了,2.30元一斤。在编 程时可不能这样,你必须事先考虑到鸡蛋的价格是必须带小数的,就算现在是2块整,也 得将价格定为实型,否则,涨成2块3时,计算机会把那0.3元给丢了,还是变成2元整
“数据类型”就是这么一个很好理解的概念。我们的重点是了解在计算机编程世界中, 有哪些基本的数据类型?在人类世界里,数据类型那就多了,把人类的对万物划分类型的 方法照搬入计算机世界,显然不可能。怎么办呢?方法就是:抽象。 计算机先哲们为我们做了这一切。其中,最重要类型,也称为 C/C++语言的基本数据类 型,只有两个:“数值”和“字符”。 第一是“数值类型”。这样,在职工的信息中,譬如年纪,工龄、工资就有了归属。你 现在需要暂时不将目光从屏幕前移开,想一想“数值类型”是一个多好的抽象结果!无论 进行任何信息管理,离开了“数”,还能管理什么? 第二是“字符类型”。像职工姓名或家庭住址,这些由字符类型的数据组成。你可能想 不到的还有,职工的电话号码 010-1234567,这也是由字符类型数据组成。0、1、2、3 不 是数字吗?应该属于上面的“数值”类型吧?嗯,你听我说:现实生活中,数字被广泛地 应用在两种不同范畴:其一是那些典型的,需要进行计算的场合。比如鸡蛋 1 斤 2.3 元; 其二则那些只用来表示符号的范畴。比如电话号码,比如车牌号。把两个电话号码进行相 加或相减的操作是没有意义的。基于数字的两种完全不一样的使用范畴,所以在被抽象到 计算机程序语言时,数字被分到“数值”和“字符”两种类型中。但字符类型并不只有阿 拉伯数字,键盘上的字母符号,都属于字符类型。 在 C/C++中,“字符类型”其实也可归入数值类型。在某些情况下,它仍然会被用来参 与计算。比如在计算机中,字符‘A’加 1 后,会得到下一个字符‘B’,这种操作符合我 们的习惯。 4.2.2 理解整型和实型 数值类型又被分为“整型”和“实型”。整型就是不带小数位的数,而实型则是指带小 数位的数,也称为“浮点数”。我们在生活中一般并不做如此区分。譬如说鸡蛋的价格罢, 今儿便宜了,一斤 2 块整,但这不防碍明儿价涨了,我们说成:涨了,2.30 元一斤。在编 程时可不能这样,你必须事先考虑到鸡蛋的价格是必须带小数的,就算现在是 2 块整,也 得将价格定为实型,否则,涨成 2 块 3 时,计算机会把那 0.3 元给丢了,还是变成 2 元整
你会问为什么不直接就定一个实型就好呢?实型不就包含了整型的值吗(如2.0等于2 元)?好!问得好,我不喜欢书上说什么就记什么,一个“为什么”也不去想的学习方法 由于能力的限制,大多数人如你我,都不能为这个世界发明奉献什么新技术,我们只能作 为技术的“接受者”而活在这个世上。然而正因为只能作为接受者,我们就更应该在学习 任何技术前,先学会从一定的高度来询问:为什么会有这个技术(这个技术为什么会出现)? 我现在需要这个技术吗(必竟学习需要占用时间)?这么做并非是一种消极态度,相反 它的积极意议在于:经过这种思考,你不仅可以把有限的时间花在值的学习上,而且只有 弄明白了一样技术(或技术的概念)产生的需要,我们才有可能真正理解它,从而比别人 学得更深刻更本质 一个问题牵出一堆废话,回答却很简单:因为在计算机里,对整数的运算要远远快于对 浮点数的运算,所以,在人类的思维习惯与计算机特点之间,必须做一个折衷。 折衷的结果就是虽然都是数值类型,但程序员在程序时,必须事先想好,哪些数据是必 须带小数计算的,那些数据定为实型,比如工资,没有哪个员工会认为老板可以将自已工 资中的小数位忽略不计;而那些可以不用,或者可以不计较小数的数值,则被建议设计成 整型,比如人的年纪,虽然可以,但我们很少需要有类似1.6岁这种说法。想想,假如 位女士说自已28岁,而你却立刻纠正她:“不,准确地说,您已经28.7岁了”……结局 会怎样呢?为了那0.7岁,不仅你的程序会跑得慢,而且会倍受女人的白眼杀伤。 想想其实也很自然:工资必须设计成实型,而年龄虽然不是必须,但建议设计成整型。 4.2.3理解数值的范围 然而事情并未就此结束。 顾及计算机的运行速度,人(程序员)做出了妥协,必须面对“整型”或“实型”的考 虑。另一方面,和速度同样重要的是计算机的空间的考虑。它让程序员必须再做一步妥协 小时候你一定有过这样的经历:你说100,另一个小伙伴就说101。你说1000,他就说 1001,你说10000,他就说:那我10001。总之他就是要比你大1。这种游戏不会有分出胜 负的结局,只会让你郁闷为什么就不能有个最大数让你说了以后,那家伙就再了无法往上 加1了!现在你学编程,儿时的“妄想”终于在计算机的世界中实现了。在计算机世界中, 你可以说一个数,当别人再住这个数加1时,真不幸,计算机会告诉他说:加1是加1了 可是结果变成0,甚至是负数
你会问为什么不直接就定一个实型就好呢?实型不就包含了整型的值吗(如 2.0 等于 2 元)?好!问得好,我不喜欢书上说什么就记什么,一个“为什么”也不去想的学习方法。 由于能力的限制,大多数人如你我,都不能为这个世界发明奉献什么新技术,我们只能作 为技术的“接受者”而活在这个世上。然而正因为只能作为接受者,我们就更应该在学习 任何技术前,先学会从一定的高度来询问:为什么会有这个技术(这个技术为什么会出现)? 我现在需要这个技术吗(必竟学习需要占用时间)?这么做并非是一种消极态度,相反, 它的积极意议在于:经过这种思考,你不仅可以把有限的时间花在值的学习上,而且只有 弄明白了一样技术(或技术的概念)产生的需要,我们才有可能真正理解它,从而比别人 学得更深刻更本质。 一个问题牵出一堆废话,回答却很简单:因为在计算机里,对整数的运算要远远快于对 浮点数的运算,所以,在人类的思维习惯与计算机特点之间,必须做一个折衷。 折衷的结果就是虽然都是数值类型,但程序员在程序时,必须事先想好,哪些数据是必 须带小数计算的,那些数据定为实型,比如工资,没有哪个员工会认为老板可以将自已工 资中的小数位忽略不计;而那些可以不用,或者可以不计较小数的数值,则被建议设计成 整型,比如人的年纪,虽然可以,但我们很少需要有类似 1.6 岁这种说法。想想,假如一 位女士说自已 28 岁,而你却立刻纠正她:“不,准确地说,您已经 28.7 岁了”……结局 会怎样呢?为了那 0.7 岁,不仅你的程序会跑得慢,而且会倍受女人的白眼杀伤。 想想其实也很自然:工资必须设计成实型,而年龄虽然不是必须,但建议设计成整型。 4.2.3 理解数值的范围 然而事情并未就此结束。 顾及计算机的运行速度,人(程序员)做出了妥协,必须面对“整型”或“实型”的考 虑。另一方面,和速度同样重要的是计算机的空间的考虑。它让程序员必须再做一步妥协。 小时候你一定有过这样的经历:你说 100,另一个小伙伴就说 101。你说 1000,他就说 1001,你说 10000,他就说:那我 10001。总之他就是要比你大 1。这种游戏不会有分出胜 负的结局,只会让你郁闷为什么就不能有个最大数让你说了以后,那家伙就再了无法往上 加 1 了!现在你学编程,儿时的“妄想”终于在计算机的世界中实现了。在计算机世界中, 你可以说一个数,当别人再住这个数加 1 时,真不幸,计算机会告诉他说:加 1 是加 1 了, 可是结果变成 0,甚至是负数
这就是计算机的空间问题:任何一个量,都有一个大的上限,和小的下限,出了这个范 围(比上限还大,比下限还小),就会称为溢出。这是一种物理的现实,也是一种人为的 规定。为什么要这样规定?原因是计算机的存储器,特别是其中很重要的内存(见上章), 其可存储的数据多少总是有限度。(而且,同样大小数,2进制的表达形式比10进制长得 多),如果允许编程像生活中一样任何一个数都可以很大很大,也就是这个量表达起来将 很长很长,那么存储器的空间就会很快用完!(无穷大就不用说了,因为不可能有无穷大 的存储器)。 就是这样,数值类型在被划分为整型和实型后,将根据所占用的空间而被继续划分为几 种不同类型。而我们,在考虑工资必须设计成带小数的实型后,必须再面对一个设计上的 考虑,工资这个量在程序里要占多大空间?依据其实很简单,就看你的单位最高月薪是多 少,凭此找到一个合适的类型。比如月薪不超过1万元,那我们选择一个刚刚可以包含10000 的数据类型 两种基础类型:数值类型和字符类型,前者说了很多,现在我们也来对字符类型做一些 附加说明。字符类型要比数值类型简单得多:它不能带小数,所以没有整型实型之说。它 占用1个字节,已经是计算机能单独处理的最小空间单位,所以也不存在继续分为不同空 间长度的问题。因此,我们将以它为例,详细说明有关数据类型的一些基本而重要的概念。 第1、由于计算机和编程都是老外的发明,而老外生活中常用的的字符并不多一一主要 是阿拉伯数字、英文字母、标点符号等一一所以字符的宽度被定为1个字节(如果忘了什 么叫字节,请看上章) 1字节=8位,所以它能表示的最大数当然是8位都是1(既然2进制的数只能是0或 1,如果是我们常见的10进制,那就8位都为9,这样说,你该懂了? 1字节的二进制数中,最大的数:1111 这个数的大小是多少呢?让我们来把它转换为十进制数。 无论是什么进制,都是左边是高位,右边是低位。第一章中我们说过,10进制数的最低 位(个)位的权值是10°,第二位是10,第三位是102……,用小学课本上的说法就是:个 位上的数表示几个1,十位上的数表示向个10,百位上的数表示几个100… 二进制数则是:第1位数表示几个1(2),第2位数表示几个2(2),第3位数表 示几个4(2),第4位数表示向个8(2
这就是计算机的空间问题:任何一个量,都有一个大的上限,和小的下限,出了这个范 围(比上限还大,比下限还小),就会称为溢出。这是一种物理的现实,也是一种人为的 规定。为什么要这样规定?原因是计算机的存储器,特别是其中很重要的内存(见上章), 其可存储的数据多少总是有限度。(而且,同样大小数,2 进制的表达形式比 10 进制长得 多),如果允许编程像生活中一样任何一个数都可以很大很大,也就是这个量表达起来将 很长很长,那么存储器的空间就会很快用完!(无穷大就不用说了,因为不可能有无穷大 的存储器)。 就是这样,数值类型在被划分为整型和实型后,将根据所占用的空间而被继续划分为几 种不同类型。而我们,在考虑工资必须设计成带小数的实型后,必须再面对一个设计上的 考虑,工资这个量在程序里要占多大空间?依据其实很简单,就看你的单位最高月薪是多 少,凭此找到一个合适的类型。比如月薪不超过 1 万元,那我们选择一个刚刚可以包含 10000 的数据类型。 两种基础类型:数值类型和字符类型,前者说了很多,现在我们也来对字符类型做一些 附加说明。字符类型要比数值类型简单得多:它不能带小数,所以没有整型实型之说。它 占用 1 个字节,已经是计算机能单独处理的最小空间单位,所以也不存在继续分为不同空 间长度的问题。因此,我们将以它为例,详细说明有关数据类型的一些基本而重要的概念。 第 1、由于计算机和编程都是老外的发明,而老外生活中常用的的字符并不多——主要 是阿拉伯数字、英文字母、标点符号等——所以字符的宽度被定为 1 个字节(如果忘了什 么叫字节,请看上章)。 1 字节 = 8 位,所以它能表示的最大数当然是 8 位都是 1(既然 2 进制的数只能是 0 或 1,如果是我们常见的 10 进制,那就 8 位都为 9,这样说,你该懂了?)。 1 字节的二进制数中,最大的数:11111111。 这个数的大小是多少呢?让我们来把它转换为十进制数。 无论是什么进制,都是左边是高位,右边是低位。第一章中我们说过,10 进制数的最低 位(个)位的权值是 100,第二位是 101,第三位是 102……,用小学课本上的说法就是:个 位上的数表示几个 1,十位上的数表示向个 10,百位上的数表示几个 100…… 二进制数则是:第 1 位数表示几个 1 (2 0),第 2 位数表示几个 2(2 1),第 3 位数表 示几个 4(2 2),第 4 位数表示向个 8(2 3 )……