2.1基本内置类型
C++定义了一套包括算术类型和空类型在内的基本数据类型
2.1.1算术类型
算术类型分为两类,整型(包括字符和布尔类型在内)和浮点型
表2.1:C++:算术类型
类型 含义 最小尺寸
bool 布尔类型 未定义
char 字符 8位
wchar_t 宽字符 16位
char16_t Unicode字符 16位
char32_t Unicode字符 32位
short 短整型 16位
int 整型 16位
long 长整型 32位
long long 长整型 64位
float 单精度浮点数 6位有效数字
double 双精度浮点数 10位有效数字
long double扩展精度浮点数 10位有效数字
布尔类型(bool)的取值是真(true)或者假(false)。
基本的字符类型是char,一个char的空间应确保可以存放机器基本字符集中任意字符对应的数字值。也就是说,一个char的大小和一个机器字节一样。
其他字符类型用于扩展字符集,如wchar_t、char16_t、char32_t。wchar_t类型用于确保可以存放机器最大扩展字符集中的任意一个字符,类型char16_t和char32_t则为Unicode字符集服务(Unicode是用于表示所有自然语言中字符的标准)。
除字符和布尔类型之外,其他整型用于表示(可能)不同尺寸的整数。C++语言规定一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。
内置类型的机器实现
计算机以比特序列存储数据,每个比特非0即1,大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块称为”字节(byte)”,存储的基本单元称为”字(word)”,它通常由几个字节组成。在C++语言中,一个字节要至少能容纳机器基本字符集中的字符。大多数机器的字节由8比特构成,字则由32或64比特构成,也就是4或8字节。
带符号类型和无符号类型
1.带符号类型可以表示正数,负数或0,无符号类型则仅能表示大于0的值。
类型int、short、long和long long都是带符号的,通过在这些类型名前添加unsigned就可以得到无符号类型,例如unsigned long。类型unsigned int可以缩写为unsigned。
2.与其他整型不同,字符型被分为了三种:char、signed char和unsigned char。特别需要注意的是:类型char和类型signed char并不一样。尽管字符型有三种,但是字符的表现形式却只有两种:带符号的和无符号的。类型char实际上会表现为上述两种形式中的一种,具体是哪种由编译器决定。
3.unsigned也能接收负值,不过会自动将这个负值转化为正值。
如何选择类型的建议:
1.当明确知晓数值不可能为负值时,选用无符号类型。
2.使用int执行整数运算。
3.在算术表达式中不要用char或bool,只有在存放数字符号或布尔值时才使用它们。
4.执行浮点数运算选用double,这是因为float通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几。
2.1.2 类型转换
数据类型转换的原则及注意问题
一、两条自动转换原则和一条强制性转换原则。
设:x为短整型(2B),y单精度型(4B),z为字符型(1B)。
1、表达式计算中数据类型的自动转换原则
参加运算的各个数据都转换成长度最长的数据类型。结果为数据长度最长的数据类型。例如:
① x+y x先自动转换成单精度型,后计算x+y,结果为单精度型;
② x+z z先自动转换成短整型,后计算x+z,结果为短整型。
2、把运算结果赋给变量时数据类型的自动转换原则
先将运算结果的数据类型自动转换成变量的数据类型,然后赋给变量。例如:
① y=x+z x+z运算结果为短整型,自动转换成单精度型,再赋给变量 y.
② x=y+z y+z运算结果为单精度型,自动转换成短整型,再赋给变量 x.
3、运算结果的强制性数据类型转换原则
强制性数据类型转换格式:(数据类型符)(表达式)
先按自动转换原则计算表达式的值,后将其转换成指定的数据类型。
仅当表达式是单个常量或变量时,表达式括号可省略。例如:
①(float)x 对 x 的值强制转换成单精度;
②(float)x+m 先对 x 的值强制转换成单精度,后再和 m 进行加运算;
③(float)(x+m) 先计算(x+m),后把(x+m)的值强制转换成单精度。
二、类型转换的注意问题
1、表达式的类型转换是临时的,式中的常量或变量的原类型均不改变。
2、把运算结果赋给变量时,若运算结果的数据长度 > 变量的数据长度,会截去超长部分,
将可能导致精度降低或产生不确定的值。
3、类型转换占用系统时间,过多的转换会降低程序运行效率。除必要的外,应选择合适的数据类型。
2.1.3字面值常量
1、 以0开头的数代表八进制,以0x开头的数表示十六进制
2、由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值。
转义字符
换行符 \n 横向制表符 \t 报警(响铃)符 \a
纵向制表符 \v 退格符 \b 双引号 \"
反斜线 \\ 问号 \? 单引号 \'
回车符 \r 进纸符 \f
指定字面值的类型