📄 教学--第四章 数据类型.htm
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0045)http://d2school.com/bcyl/bhcpp/newls/ls04.htm -->
<HTML><HEAD><TITLE>教学--第四章 数据类型</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>P {
MARGIN: 1px 2px; LINE-HEIGHT: 150%
}
.节标题 {
FONT-WEIGHT: bold; FONT-SIZE: 12pt
}
TD {
FONT-SIZE: 9pt
}
.tdtitle {
FONT-SIZE: 20pt
}
.celltopline {
BORDER-TOP: #000000 1px solid
}
.menucell {
FONT-SIZE: 10pt
}
#glowtext {
FONT-SIZE: 10pt; FILTER: glow(color=red,strength=1); WIDTH: 100%
}
A:link {
FONT: 10pt 宋体; COLOR: blue; TEXT-DECORATION: none
}
A:visited {
FONT: 10pt 宋体; COLOR: purple; TEXT-DECORATION: none
}
A:active {
FONT: 10pt 宋体; COLOR: red; TEXT-DECORATION: underline
}
A:hover {
COLOR: blue; TEXT-DECORATION: underline
}
</STYLE>
<META content="MSHTML 6.00.2900.2180" name=GENERATOR></HEAD>
<BODY leftMargin=0 topMargin=3><!-- 标题 --><!--标题结束 --><A name=页首></A>
<CENTER>
<TABLE height=154 cellSpacing=4 cellPadding=4 width=760 border=0>
<TBODY>
<TR>
<TD
style="FONT-SIZE: 10pt; MARGIN-LEFT: 12px; TEXT-INDENT: 20px; LINE-HEIGHT: 150%; MARGIN-RIGHT: 12px; FONT-FAMILY: 宋体"
width="100%" height=148>
<H2><BR>第四章 数据类型</H2>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.1">4.1
这是个有类型的世界</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2">4.2
数据类型基本概念</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2.1">4.2.1
理解数据类型</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2.2">4.2.2
理解整型和实型</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2.3">4.2.3
理解数值的范围</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.2.4">4.2.4
理解有符号数和无符号数</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.3">4.3
字符集和保留字</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.3.1">4.3.1
字符集</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.3.2">4.3.2
保留字</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.4">4.4
基本数据类型</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.4.1">4.4.1
字符型和各种整型、实型</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.4.2">4.4.2
布尔型(bool)和无类型(void)</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.4.3">4.4.3
为数据类型起别名:typedef</A></P>
<P><A href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.5">4.5 sizeof
的使用</A></P>
<P> <A
href="http://d2school.com/bcyl/bhcpp/newls/ls04.htm#4.5.1">4.5.1 sizeof
例程</A><BR></P>
<H3><A name=4.1>4.1</A> 这是个有类型的世界</H3>
<P>问大家一个问题:</P>
<P>现实生活,有哪些信息可以用计算机可以管理呢?</P>
<P>职工、学员、客户、工资、原材料、产品、商品……现实中实现用计算机管理的信息已是无数。</P>
<P>职工又有什么信息呢?</P>
<P>职工有姓名、性别、出生年月、家庭住址、电话,婚否、工龄、工种、工资、等等。</P>
<P> </P>
<P>这两个问题你可能回答得不错,现在,考验你前几章有没有认真学习的时刻到了,请看下面这个问题:</P>
<P>所有的这些信息,在计算机里都是以什么样的数据形式来表达呢?请自觉闭上眼睛,想一想。再看以下的各种回答。</P>
<P> </P>
<P>“二进数”,正确。</P>
<P>“已数字化的数据”,也算正确。</P>
<P>“0和1”,正确。</P>
<P>“机器语言”,正确,你还记得第一章的内容啊,不错。</P>
<P> </P>
<P>本章需要继续的一个问题就由此开始。所有的信息都用机器语言——那些0和1——表达,那你我编写程序岂不很难?</P>
<P>这是第一章的问题,你还记得在第一章关于本问题回答吗?那就是:机器语言不好记,那就用高级语言。高级语言高级在哪里呢?第一章也有答案:就高级在它尽量向“高级动物”的思维习惯做了一些接近。当然,只能说尽量,它必须仍然保持符合机器的绝大部分特点,否则,大家就不要学<B>计算机</B>语言了。</P>
<P>数据类型,就是计算机语言向人类语言靠近时,走出的第一步,很重要的一步。(机器语言或汇编语里,没有数据类型一说。)</P>
<P>人类的世界,是有类型的世界。</P>
<P>树木花草,归一类:植物;</P>
<P>猪狗猫羊,动物;</P>
<P>金银铜铁,金属;</P>
<P>你我他她,人类。(不要告诉我你不是人类,在这虚拟的网络的世界……)</P>
<P>上一章笔者“鼓吹”过一个观点:<B>整个世界都可以用数据和处理来表达。</B>基于此,整个世界就是一个程序;而万物是世界的数据。如果你找一个人,对他说:“你等于一只猪”,他一定暴跳如雷。为什么呢?嘻嘻,学了这一章,我们就可以从程序的角度来解释了:人和猪不是一类型,不适于做赋值操作。待以后我们学了C++的“类”,则又有更好回答:上帝创造世界是,没有为人“类”实现参数为猪“类”的拷贝构造函数,或等号重载函数。</P>
<P>(想和上帝做同行?快做个程序员。)</P>
<H3><A name=4.2>4.2</A> 数据类型基本概念</H3>
<H4><A name=4.2.1>4.2.1</A> 理解数据类型</H4>
<P>“数据类型”就是这么一个很好理解的概念。我们的重点是了解在计算机编程世界中,有哪些基本的数据类型?在人类世界里,数据类型那就多了,把人类的对万物划分类型的方法照搬入计算机世界,显然不可能。怎么办呢?方法就是:抽象。</P>
<P>计算机先哲们为我们做了这一切。其中,最重要类型,也称为C/C++语言的<B>基本数据类型</B>,只有两个:“数值”和“字符”。</P>
<P>第一是“数值类型”。这样,在职工的信息中,譬如年纪,工龄、工资就有了归属。你现在需要暂时不将目光从屏幕前移开,想一想“数值类型”是一个多好的抽象结果!无论进行任何信息管理,离开了“数”,还能管理什么?</P>
<P> </P>
<P>第二是“字符类型”。像职工姓名或家庭住址,这些由字符类型的数据组成。你可能想不到的还有,职工的电话号码
010-1234567,这也是由字符类型数据组成。0、1、2、3不是数字吗?应该属于上面的“数值”类型吧?嗯,你听我说:现实生活中,数字被广泛地应用在两种不同范畴:其一是那些典型的,需要进行计算的场合。比如鸡蛋1斤2.3元;其二则那些只用来表示符号的范畴。比如电话号码,比如车牌号。把两个电话号码进行相加或相减的操作是没有意义的。基于数字的两种完全不一样的使用范畴,所以在被抽象到计算机程序语言时,数字被分到“数值”和“字符”两种类型中。但字符类型并不只有阿拉伯数字,键盘上的<B>字</B>母<B>符</B>号,都属于<B>字符</B>类型。</P>
<P> </P>
<P>在C/C++中,“字符类型”其实也可归入数值类型。在某些情况下,它仍然会被用来参与计算。比如在计算机中,字符‘A’加1后,会得到下一个字符‘B’,这种操作符合我们的习惯。</P>
<H4><A name=4.2.2>4.2.2</A> 理解整型和实型</H4>
<P>数值类型又被分为“整型”和“实型”。整型就是不带小数位的数,而实型则是指带小数位的数,也称为“浮点数”。我们在生活中一般并不做如此区分。譬如说鸡蛋的价格罢,今儿便宜了,一斤2块整,但这不防碍明儿价涨了,我们说成:涨了,2.30元一斤。在编程时可不能这样,你必须事先考虑到鸡蛋的价格是必须带小数的,就算现在是2块整,也得将价格定为实型,否则,涨成2块3时,计算机会把那0.3元给丢了,还是变成2元整。</P>
<P>你会问为什么不直接就定一个实型就好呢?实型不就包含了整型的值吗(如2.0等于2元)?好!问得好,我不喜欢书上说什么就记什么,一个“为什么”也不去想的学习方法。由于能力的限制,大多数人如你我,都不能为这个世界发明奉献什么新技术,我们只能作为技术的“接受者”而活在这个世上。然而正因为只能作为接受者,我们就更应该在学习任何技术前,先学会从一定的高度来询问:为什么会有这个技术(这个技术为什么会出现)?我现在需要这个技术吗(必竟学习需要占用时间)?这么做并非是一种消极态度,相反,它的积极意议在于:经过这种思考,你不仅可以把有限的时间花在值的学习上,而且只有弄明白了一样技术(或技术的概念)产生的需要,我们才有可能真正理解它,从而比别人学得更深刻更本质。</P>
<P>一个问题牵出一堆废话,回答却很简单:因为在计算机里,对整数的运算要远远快于对浮点数的运算,所以,在人类的思维习惯与计算机特点之间,必须做一个折衷。</P>
<P>折衷的结果就是虽然都是数值类型,但程序员在程序时,必须事先想好,哪些数据是必须带小数计算的,那些数据定为实型,比如工资,没有哪个员工会认为老板可以将自已工资中的小数位忽略不计;而那些可以不用,或者可以不计较小数的数值,则被建议设计成整型,比如人的年纪,虽然可以,但我们很少需要有类似1.6岁这种说法。想想,假如一位女士说自已28岁,而你却立刻纠正她:“不,准确地说,您已经28.7岁了”……结局会怎样呢?为了那0.7岁,不仅你的程序会跑得慢,而且会倍受女人的白眼杀伤。</P>
<P>想想其实也很自然:工资必须设计成实型,而年龄虽然不是必须,但建议设计成整型。</P>
<H4><A name=4.2.3>4.2.3</A> 理解数值的范围</H4>
<P>然而事情并未就此结束。</P>
<P>顾及计算机的运行速度,人(程序员)做出了妥协,必须面对“整型”或“实型”的考虑。另一方面,和速度同样重要的是计算机的空间的考虑。它让程序员必须再做一步妥协。</P>
<P>小时候你一定有过这样的经历:你说100,另一个小伙伴就说101。你说1000,他就说1001,你说10000,他就说:那我10001。总之他就是要比你大1。这种游戏不会有分出胜负的结局,只会让你郁闷为什么就不能有个最大数让你说了以后,那家伙就再了无法往上加1了!现在你学编程,儿时的“妄想”终于在计算机的世界中实现了。在计算机世界中,你可以说一个数,当别人再住这个数加1时,真不幸,计算机会告诉他说:加1是加1了,可是结果变成0,甚至是负数。</P>
<P>这就是计算机的空间问题:任何一个量,都有一个大的上限,和小的下限,出了这个范围(比上限还大,比下限还小),就会称为<B>溢出</B>。这是一种物理的现实,也是一种人为的规定。为什么要这样规定?原因是计算机的存储器,特别是其中很重要的内存(见上章),其可存储的数据多少总是有限度。(而且,同样大小数,2进制的表达形式比10进制长得多),如果允许编程像生活中一样任何一个数都可以很大很大,也就是这个量表达起来将很长很长,那么存储器的空间就会很快用完!(无穷大就不用说了,因为不可能有无穷大的存储器)。</P>
<P>就是这样,数值类型在被划分为整型和实型后,将根据所<B>占用的空间</B>而被继续划分为几种不同类型。而我们,在考虑工资必须设计成带小数的实型后,必须再面对一个设计上的考虑,工资这个量在程序里要占多大空间?依据其实很简单,就看你的单位最高月薪是多少,凭此找到一个合适的类型。比如月薪不超过1万元,那我们选择一个刚刚可以包含10000的数据类型。</P>
<P>两种基础类型:数值类型和字符类型,前者说了很多,现在我们也来对字符类型做一些附加说明。字符类型要比数值类型简单得多:它不能带小数,所以没有整型实型之说。它占用1个字节,已经是计算机能单独处理的最小空间单位,所以也不存在继续分为不同空间长度的问题。因此,我们将以它为例,详细说明有关数据类型的一些基本而重要的概念。</P>
<P>第1、由于计算机和编程都是老外的发明,而老外生活中常用的的字符并不多——主要是阿拉伯数字、英文字母、标点符号等——所以字符的宽度被定为1个<B>字节</B>(如果忘了什么叫字节,请看上章)。</P>
<P>1字节 =
8位,所以它能表示的最大数当然是8位都是1(既然2进制的数只能是0或1,如果是我们常见的10进制,那就8位都为9,这样说,你该懂了?)。</P>1字节的二进制数中,最大的数:11111111。
<P>这个数的大小是多少呢?让我们来把它转换为十进制数。</P>
<P>无论是什么进制,都是左边是高位,右边是低位。第一章中我们说过,10进制数的最低位(个)位的权值是10<SUP>0</SUP>,第二位是10<SUP>1</SUP>,第三位是10<SUP>2</SUP>……,用小学课本上的说法就是:个位上的数表示几个1,十位上的数表示向个10,百位上的数表示几个100……</P>
<P>二进制数则是:第1位数表示几个1
(2<SUP>0</SUP>),第2位数表示几个2(2<SUP>1</SUP>),第3位数表示几个4(2<SUP>2</SUP>),第4位数表示向个8(2<SUP>3</SUP>)……</P>
<P><B>在C/C++中,很多计数的习惯都是从0开始</B>,所以,在你看明白上面那行内容后,让我们立刻改口换成下面的说法,以后我们只用这种说法:</P>
<P>二进制数:第<B>0</B>位数表示几个1
(2<SUP>0</SUP>),第<B>1</B>位数表示几个2(2<SUP>1</SUP>),第<B>3</B>位数表示几个4(2<SUP>2</SUP>),第<B>4</B>位数表示向个8(2<SUP>3</SUP>)……</P>
<P>按照这种说法,我们可以发现,从右向左数,第n位数的权值 = 2的n次方。</P>
<P><B>二进制各位权值的计算方法: 第n位权值 = 2<SUP>n</SUP></B></P>
<P> </P>
<P>下表详细地表示 2进制数:11111111 是如何逐位计算,累加得到10进制的值:</P>
<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0>
<TBODY>
<TR>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
width="15%">第几位</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">7</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">6</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">5</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">4</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
align=middle width="9%">3</TD>
<TD
style="BORDER-TOP: #000000 1px solid; BORDER-LEFT: #000000 1px solid"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -