C++定义了一套包括算术类型和空类型在内的基本数据类型.
算术类型分为两类:整型(包括字符和布尔类型在内)和浮点型.
C++语言规定一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大.
除去布尔型和扩展的字符型之外,其他整型可以划分为带符号的(signed)和无符号的(unsigned).带符号类型可以表示正数,负数或0,无符号类型仅能表示大于等于0的值.
字符型被分为三种:char unsigned char 和 unsigned char.类型char和类型signed char并不一样.尽管字符型有三种,但是字符的表现形式却只有两种:带符号的和无符号的.类型char实际上会表现为上述两种形式中的一种,具体是哪种由编译器决定.
- 当明确知晓数值不可能为负时,选用无符号类型
- 使用int执行整数运算
- 在算术表达式中不要使用char或bool,只有在存放字符或布尔值时才使用它们.因为类型char在一些机器上是有符号的,在另一些机器上又是无符号的,所以如果使用char进行运算容易出现问题.如果要使用一个不大的整数,那么明确指定它的类型是signed char或者unsigned char
- 执行浮点数运算选用double,因为float通常精度不够而且双精度浮点数和单精度浮点数的计算代价相差无几.
对象的类型定义了对象能包含的数据和能参与的运算,其中一种运算被大多数类型支持,就是将对象从一种给定的类型转换为另一种相关类型.当在程序的某处我们使用了一种类型而其实对象应该取另一种类型时,程序会自动进行类型转换.
- 当我们把一个非布尔类型的算数值赋给布尔类型时,初始值为0则结果为false,否则为true
- 当我们把一个布尔值赋给非布尔类型时,初始值为false则结果为0,初始值为true则结果为1
- 当我们把一个浮点数类型赋给整数类型时,进行了近似处理.结果值将仅保留浮点数中小数点之前的部分
- 当我们把一个整数值赋给浮点类型时,小数部分记为0.如果该整数所占的空间超过了浮点类型的容量,精度可能有损失.
- 当我们赋给无符号类型一个超出他表示范围的致时,结果是初始值对无符号类型表示数值总数取模后的余数.
- 当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的(undefined),此时,程序可能继续工作,可能崩溃,也可能生成垃圾数据
在第一个输出表达式里,两个整数相加结果正确.在第二个输出表达式里,相加前首先把整数-42转换成无符号数.把负数转换成无符号数类似于直接给无符号数赋一个负值,结果等于这个负数加上这个无符号数的模.
当从无符号数中减去一个值时,不管这个值是不是无符号数,我们都必须确保结果不能是一个负值.
无符号数不会小于0同样关系循环的写法.
如果表达式里既有带符号类型又有无符号类型,当带符号类型取值为负时会出现异常结果,因为带符号数会自动地转换成无符号数.
一个形如42的值被称作字面值常量(literal).每个字面值常量都对应一种数据类型,字面值常量的形式和值决定了它的数据类型.
我们可以将整形字面值写作十进制数,八进制数或十六进制数的形式.
20 /* 十进制 * / 024 /* 八进制 */ 0x14 / * 十六进制 */
尽管整型字面值可以存储在带符号数据类型中,但严格来说,十进制字面值不会是负数.如果我们使用了一个形如-42的负十进制字面值,那个符号并不在字面值之内,它的作用仅仅是对字面值取负值而已.
由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串型字面值.
'a' // 字符字面值
"Hello World" // 字符串字面值
字符串字面值的类型实际上是由常量字符构成的数组.编译器在每个字符串的结尾处添加一个空字符(’\0’).
如果两个字符串字面值位置紧邻且仅由空格,缩进和换行符分隔,则它们实际上是有一个整体.
有两类字符不能直接使用:一类是不可打印(nonprintable)的字符,如退格或其他控制字符,因为他们没有可视的图符;另一类是在C++语言中有特殊含义的字符(单引号,双引号,问号,反斜线).在这些情况下需要转义序列(escape sequence),转义字符均以反斜线作为开始.
换行符 \n | 横向制表符 \t | 报警(响铃)符 \a |
---|---|---|
纵向制表符 \v | 退格符 \b | 单引号 \" |
反斜线 \\ | 问号 ? | 单引号 \’ |
回车符 \r | 进纸符 \f |
通过添加如下表中的前缀和后缀,可以改变整型,浮点型和字符型字面值的默认类型.
L'a' // 宽字符型字面值,类型是wchar_t
u8"hi!" // utf-8字符串字面值
42ULL // 无符号整型字面值 类型是unsigned long long
1E-3F // 单精度浮点型字面值 类型是float
3.14159 // 扩展精度浮点型字面值 类型是long double
true和false是布尔类型的字面值:
bool test = false;
nullptr是指针字面值.