其他章节:C++ Primer 学习心得
C++定义了一套包括算术类型和空类型(void
)在内的基本数据类型,其中算数类型包含字符、整型数和浮点数。空类型不对应具体的值,仅用于一些特殊场合,当函数不返回任何值时使用空类型作为返回类型。
算术类型
- 分为两类:整型(包括
char
与bool
在内)和浮点型。
|
|
|
---|---|---|
| 布尔类型 | 未定义 |
| 字符 | 8位 |
| 宽字符 | 16位 |
| Unicode字符 | 16位 |
| Unicode字符 | 32位 |
| 短整型 | 16位 |
| 整形 | 16位 |
| 长整型 | 32位 |
longlong | 长整型 | 64位 |
| 单精度浮点数 | 6位有效数字 |
| 双精度浮点数 | 10位有效数字 |
long double | 扩展精度浮点数 | 10位有效数字 |
Bool
- 取值是真(
true
)或假(false
)。
字符
- 基本的字符类型是
char
,大小与一个机器字节一样。
整型
- 一个
int
至少和一个short
一样大; - 一个
long
至少和一个int
一样大; - 一个
long long
至少和一个long
一样大。
浮点型
- 浮点型可以表示单精度、双精度和扩展精度值。
- C++标准指定了浮点数的有效位数的最小值,大多编译器实现了更高的精度。
float
以32bit来表示;double
以64bit来表示;long double
以96或128bit来表示
- 一般地,
float
和double
分别有7和16个有效位。
带符号数和无符号类型
- 除
bool
与扩展的字符型外,其他整型可以划分为带符号(signed
)和无符号(unsigned
); - 带符号类型可以表示整数、负数和0,无符号类型仅能表示大于等于0的值。
int
、short
、long
和long long
都是带符号的,类型名前加unsigned
即可得到无符号类型。- 无符号类型中的所有bit都用来储值,带符号类型存在符号位。
字符型
- 字符型被分为三种,
char
、signed char
和unsigned char
; char
与signed char
不同,字符的表现形式只有两种:带符号与无符号,由编译器决定类型char
表示为哪一种。
类型选择
- 明确知晓数值不为负,选择无符号类型。
- 一般
long
与int
有相同的大小,超出int
的表示范围,选用long long
。 - 算数表达式不用
char
或bool
,只有存放字符或Bool
值才使用。 char
在一些机器上有符号(一些没有),使用不大的整数明确指明signed char
或者unsigned char
。- 浮点数运算选用
double
,floa
t精度不够且计算代价相差较小,一些机器双精度运算更快,long double
一般不必要。
类型转换
当程序中使用了一种类型而其实对象应该取另一种类型时,程序会自动进行类型转换。
bool
- 非
bool
类型的算术值赋值给bool
类型时,初始值为0
结果为false
,否则结果为true
。 bool
型赋值为非bool
类型时,初始值false
结果为0
,初始值true
结果为1
。
浮点数
- 浮点数赋值给整数,仅保留浮点数的整数部分。
- 整数赋值给浮点数,小数部分记为0,如果整数所占空间超过了浮点类型的容量,精度可能会有损失。
符号类型
- 给无符号类型赋值一个超出范围的值,结果是初始值对无符号类型表示数值总数取模后的余数。
- 给带符号类型赋值一个超出范围的值,结果是
未定义
。
含有无符号类型的表达式
- 一个算数表达式既有无符号数又有
int
值时,int
值就会自动转换为无符号数。 - 无符号数减去一个值,不管是否为无符号数,都必须确保结果不是负值。
unsigned u1 = 42, u2 = 10;
u1 - u2 // 正确 32;
u2 - u1 // 正确 结果取模
- 无符号数不会小于0,影响循环写法:
// u不会小于0,循环一直成立
for (unsigned u =10, u >= 0; --u)
std::cout << u << std::endl;
// while语句代替for语句
unsigned u == 11; // 确定最大数,从比它大1的数开始
while (u > 0){
--u;
}
- 不要混用带符号类型与无符号类型,当带符号类型取值为负时会出现异常的结果,带符号数自动转换成无符号数。
字面型常量
每个字面值常量对应一种数据类型,字面值常量的形式和值决定它的数据类型。
整型和浮点型字面值
- 整型字面值可以写作十进制、八进制和十六进制。
0
开头——八进制数;0x
或0X
开头——十六进制数;- 十进制字面值是带符号数,八进制与十六进制字面值可能带符号也可能无符号。
- 十进制字面值的类型是
int
、long
和long long
中尺寸最小的那个(例如,三者当中最小是int
),前提是这种类型要能容纳下当前的值。 - 八进制和十六进制字面值的类型是能容纳其数值的
int
、unsigned int
、long
、unsigned long
、long long
和unsigned long long
中的尺寸最小者。 - 如果一个字面值连与之关联的最大的数据类型都放不下,将产生错误。
- 类型
short
没有对应的字面值。 - 十进制的字面值不会是负数,负号不在字面值中,仅对字面值取负数。
- 浮点型字面值为一个小数或以科学技术法表示的指数,指数用E或e表示。
- 浮点型字面值是一个double。
字符和字符串字面值
- 单引号括起来的一个字符称为
char
型字面值,双引号括起来的零个或多个字符构成字符串型字面值。 - 字符串字面值的类型是常量字符构成的数组(
array
)。 - 编译器在每个字符串结尾处添加一个空字符(
\0
),字符串字面值的实际长度比内容多1。 - 如果两个字符串字面值位置紧邻且仅有空格、缩进和换行符分隔,实际上是一个整体。
- 字符串字面值较长,写在一行不合适时,可以采取分开书写的方式。
转义序列
不能直接使用的字符:
- 不可打印字符,如退格或其他控制字符,没有可视的图符;
- C++语言有特殊含义的字符——转义序列
转义字符
- 换行符
\n
- 横向制表符
\t
- 报警符
\a
- 纵向制表符
\v
- 退格符
\b
- 双引号
\''
- 反斜线
\\
- 问号
\?
- 单引号
\'
- 回车符
\r
- 进纸符
\f
泛化序列
\x
后紧跟1个或多个十六进制数字,\x
用到后面跟着的所有数字。\
后紧跟1个、2个或3个八进制数字,超过3个则只有前3个与\
构成转义序列。
指定字面值的类型
字符和字符串字面值
前缀 | 含义 | 类型 |
---|---|---|
u | Unicode16字符 | char16_t |
U | Unicode32字符 | char32_t |
L | 宽字符 | wchar_t |
u8 | UTF-8(仅用于字符串字面常量) | char |
整形字面值
后缀 | 最小匹配类型 |
---|---|
u or U | unsigned |
l or L | long |
ll or LL | long long |
- 使用长整型字面值时,使用大写字母
L
标记,小写字母l
与数字1容易混淆。
浮点型字面值
后缀 | 类型 |
---|---|
f or F | float |
l or L | long double |
- 以
U
为后缀的十进制数、八进制数或十六进制数都将从unsigned int
、unsigned long
和unsigned long long
中选择能匹配的空间最小的一个作为其数据类型。 - 如果后缀中有
L
,则字面值的类型至少是long
;如果后缀中有LL
,则字面值的类型将是long long
和unsigned long long
中的一种。 - 可以将
U
与L
或LL
合在一起使用。以UL
为后缀的字面值的数据类型将根据具体数值情况或者取unsigned long
,或者取unsigned long long
。
bool
字面值和指针字面值
true
和false
是bool
类型的字面值;nullptr
是指针字面值。