《零点起飞学C++之数据类型》由会员分享,可在线阅读,更多相关《零点起飞学C++之数据类型(44页珍藏版)》请在金锄头文库上搜索。
1、第2章 数 据 类 型 数据是能被计算机存储和处理的对象。数 据类型则规定了数据的组织和操作方式, 它说明了数据是怎么存储的以及怎么对数 据进行操作。C+中的数据类型主要分为整 型和浮点型。学习本章,读者可以了解C+ 处理数据的本质。2.1 数据的表示 数字运算型是能够进行数学运算的数据类 型,主要有整型、浮点型和双精度型。其 中,整型表示整数,浮点型、双精度型表 示实数。其表示范围从大到小,依次为双 精度型、浮点型、整型。但是由于计算机 自身的限制,无论是整型、浮点型还是双 精度型都不能表示全部的整数和实数。2.1.1 整型 整型就是整数类型。由于计算机存储字长的限 制,整型所能表示的数的范
2、围是数学概念下整 数的子集。整型数可以用十进制、八进制、十 六进制等3种进制表示。 十进制由09的数字组成,不能以0开始,没 有小数部分,如11、11、0等都是整型数。 八进制以0开始,由07的数字组成,如011、 023等。 十六进制以0x开始,由09的数字及A到F的 字母组成,如0x10、0xAA、0x1a等。 根据整型字长的不同,又可以分为短整型、整 型、长整型3种。短整型至少长为16位;长整 型至少为32位;整型介于短整型和长整型之 间。整型究竟为16位还是32位,或者是其他值 ,由具体的编译器来决定。通常情况下,整型 的长度是该种机型最为高效的位数。 整型用int表示,短整型在int
3、前加short修饰符, 长整型则加long。根据有无符号,整型还可分 为有符号型和无符号型,分别用signed和 unsigned来修饰。与3种整型类型相组合共有下 述6种类型可用,如表2-1所示。表2-1 各种整型类型的可能取值范 围 通常情况下,signed修饰符可以省略不写, 默认为有符号类型。当错误的为无符号型 变量赋有符号的值时,有些编译器会报错 ,而有些则不会,但却作为可能的最大整 型值处理。类 型最 小 范 围类 型最 小 范 围signed short int32 76832 767unsigned int065 535unsigned short int065 535sign
4、ed long int2 147 483 6482 147 483 647signed int32 76832 767unsigned long int04 294 967 295 例如,同样是数字1,如果被定义为int型, 则系统将用16位来存储;如果定义为long型 ,将占用32位存储空间。 从可移植性角度考虑,在实际编程时,不 建议直接使用表2-1中的范围值。这些值在 头文件limits.h中都以宏定义的形式给出, 如表2-2所示。表2-2 各种整型类型的宏定义符号类型有 符 号 型无 符 号 型最 大 值最 小 值最 大 值最 小 值short intSHRT_MAXSHRT_MINU
5、SHRT_MAX intINT_MAXINT_MINUINT_MAX long intLONG_MAXLONG_MINULONG_MAX 对于无符号时的最小值,该文件中没有定 义,但该值很明确是0。为了防止溢出,在 实际编程时,应该小心测试计算得到的数 据是否在允许的范围内。这些宏定义在程 序中可以作为常量直接使用。 说明:在科学计算中,还常会用到long long int和int64等整型类型。这些类型有更 大的位长,因此也就可以表示更大范围的 数据。2.1.2 实型 实型既实数类型。日常用到的数可分为整数和 实数,整数可以直接在计算机上表示,而实数 则还不能直接表示。为了解决实数的表示和存
6、 储问题,在计算中采用了“浮点”化方法。 不像直接用“整型”来命名整数类型,C+并没 有直接用“实型”来命名实数类型,而是将其命 名为“浮点型”。之所以这么命名,是因为实数 在机器上的表示方式叫浮点型表示,所以计算 机科学中也将实数称为浮点数。 假设基数为2,浮点数表示方式如下所示。 N=M2E 其中,M代表尾数,E代表阶码。在计算机 中存储时,只需保存尾数和阶码即可,形 式如下表。表 数的精度由尾数决定,数的范围由阶码决 定,数的符号由尾数符号表示。按照精度 来分,可分为单精度型和双精度型。尾数符号阶码尾数【示例2-1】 实数13.75表示为浮点型的转换过程。 (1)转换为二进制表示。 (1
7、3.75)10=(1101.11)2 (2)规格化。 (1101.11)2=(1.1011123)2 (3)浮点数表示如下表:表 实际转换和存储方式比这里讲的要复杂的 多,读者可以参考相关书籍学习,这里不 再赘述。 这一小节的目的是让读者理解C+中的实数 类型,从数学概念下的实数类型转换到计 算机概念下的浮点型。接下来两小节将分 别讲解浮点型的两种表示范围:单精度浮 点型和双精度浮点型。010000010(3+127 = 130的二进制表示)10112.1.3 浮点型 浮点型就是单精度实数,或者叫单精度浮 点数。它表示的是实数的子集,用float来说 明,32位长。如果小数点前的整数部分是0
8、,则0可以省略,但必须保留小数点;如果 小数部分是0,则0不仅可以省略,还可以 省略掉小数点。所以,浮点数可以有下述4 种不同的表示方式。 .12 10. 10 10.0 其中,第1种省略掉了小数点前的0,实际为0.12; 第2种省略掉了小数点后的0,实际为10.0;第3种不 仅省略了小数点后的0,也省略掉了小数点;第4种 是规范的写法。虽然,前3种写法都正确,但是很 明显第4种的写法要清晰明确。实际编程时,建议 采用第4种。 此外,浮点数还可以写成指数形式,格式如下 : eexp 这是以10为基数的阶码表示。其中,e为尾数 ,exp为阶码,即指数。上式等价于下述形式 : e10exp 这属于
9、科学计数法。【示例2-2】 采用科学计数法来表示3个数。 a=6.3e-3; b=2.2e4; c=6.3e;/错误的表示方法 其中,a即为6.3103,b为2.2104。变量c的 写法是错误的,因为用指数形式表示浮点数时 ,指数部分不能省略。2.1.4 双精度型 双精度型是指双精度浮点数。它的精度,或者说可 表示的数的范围比单精度浮点数要大很多。它用 double来修饰,64位长。双精度浮点数的表示范围 定义在float.h中,分别用DBL_MAX和DBL_MIN表 示上限和下限。双精度浮点数与单精度浮点数的差 别只在所能表示的数的范围上,其表示方式是一样 的。如果将2.13节中的数0.12
10、、10.0定义为double型 ,那么它们将占用64位而不是32位。 说明:在科学计算中,有时候还会用到另一种范 围更大的实数类型:扩展精度的双精度浮点数。这 种类型用long double来说明,但并不是所有的机器 都支持。2.2 是非问题逻辑运算 逻辑运算类型是用来定义逻辑型数据的类 型,用关键字bool来说明。C+中并没有提 供专门的逻辑类型,而是借用其他类型来 表示,用0表示逻辑假,非0表示逻辑真。 C+专门定义了宏true和false来分别表示真 和假。这两个宏的值其实就是1和0。逻辑 类型数据是数,可以参加数的运算。但实 际编程时,并不鼓励对逻辑型使用其他类 型的数据来赋值和作运算
11、,要尽量使用true 和false宏定义。2.2.1 与运算 逻辑型的与运算又叫逻辑与,相当于生活 中的“并且”。它是对两个或两个以上的逻辑 类型数据进行逻辑与的运算,用符号“ 其中,expr1和expr2都是结果为逻辑型值的 表达式。当expr1和expr2的值都为真时,结 果为真;只要有一个表达式的结果为假, 与运算的结果即为假。表2-3是与运算的真 值表。表2-3 与运算的真值表 实际计算时,首先计算expr1的值。当expr1的值为 假时,整个运算的结果也为假,就不再需要计算 expr2的值了。当exprt1的值为真时,才计算expr2的 值。这时expr2的结果就是整个运算的结果。因
12、此, 其可能的计算步骤为: (1)如果expr1为false,则停止计算,返回false; (2)如果expr1为true,则返回expr2的值。表达式1表达式2结 果 表达式1表达式2结 果truetruetruefalsetruefalsetruefalsefalsefalsefalsefalse【示例2-3】 假设a、b都是bool型,且a的值为true,b的值 为false,则a和b的与运算写作如下形式: a 由于a的值为true,则与运算的结果将与b相 同。所以在进行与运算时,应该尽量把最可能 结果为假的表达式作为expr1,以减少运算 量。这种计算顺序被称为“短路求值”。2.2.2
13、 或运算 或运算就是对两个或两个以上的表达式进行逻 辑或运算,相当于生活中的“或者”。它用符号 “|”表示,或运算符号两边是两个值为逻辑型 的表达式。其形式如下所示。 expr1|expr2; 其中,expr1和expr2都是结果为逻辑型值的表 达式。当expr1和expr2的值都为假时,结果为 假;只要有一个表达式的结果为真,或运算的 结果既为真。表2-4是或运算的真值表。表2-4 或运算的真值表 或运算也有短路求值的方法。先计算expr1 ,如果expr1为真,则不再计算expr2,整个 表达式结果为真。若expr1为假,则计算 expr2,结果与expr2一致。因此在使用时, 尽量把最可
14、能为真的表达式放在前面。表达式1表达式2结 果 表达式1表达式2结 果truetruetruetruefalsetruefalsefalsefalsefalsetruetrue【示例2-4】 假设a、b都是bool型,且a的值为true,b的 值为false,则a和b的或运算写做如下形式: a|b; 由于a的值为true,所以不需要再计算b的 值。因此或运算的结果与a同为true。2.2.3 非运算 非运算是对逻辑型值求反的运算,相当于生活 中的“非”。它用符号“!”表示,表达式在符号的 右边,属于单目运算。形式如下所示。 !expr; 其中,expr是一个结果为逻辑型的表达式,非 运算的结果
15、与expr相反。expr为真,非运算就 为假。反之,为真。表2-5是非运算的真值 表。表2-5 非运算的真值表 非运算就是否定原来的值,得到相反的 值。所以对一个逻辑型值做两次非运算, 就又得到原来的值。实际上,偶数次非运 算,原值不变,相当于不作非运算;奇数 次非运算,原值反转,相当于一次非运 算。非运算的这个性质可以帮助简化复杂 的逻辑表达式,理解复杂表达式的意思。结 果表 达 式结 果表 达 式truefalsefalsetrue【示例2-5】 假设a是bool型为true,则a的非运算写作如下 形式: !a; 非运算对a求反,因此非运算的结果为false。 注意:也许在某些材料中还会见到布尔型的 叫法,它和逻辑型是一样的,是同一个类型的 两种叫法。修饰符bool全写为boolean,逻辑型 是其意译,布尔型是其音译。2.2.4 逻辑运算的组合 在实际的应用中,往往不能单用某一种逻 辑运算来解决问题,而是这些逻辑运算的 有机组合。当将这些运算组合时,就能表 示复杂的判断。【示例2-6】 假设year存放年份,则判断某年是否为闰年,可用如下复合 的逻辑运算。 (year4=0) 其中,char是字符型的说明符,var是变量名。 每个变量只能容纳一个字符,每个字符用一对 单引号包含起来。如a、1、*等都是字 符。关于字符,需要掌握如下几个知识点1字符型数据的存储 字符型数据