- 2.1.1 算术类型(arithmetic type)
- 【1】算术类型的分类
- 【2】算术类型的尺寸
- 【3】带/无符号类型
- 【4】如何选择类型
- 2.1.2 类型转换
- 【1】六种类型转换的情况
- 【2】含有无符号类型的表达式
- 2.1.3 字面值常量(literal)
- 【1】整型、浮点型、字符、字符串、布尔、指针字面值
- 【2】转义序列
- 【3】指定字面值的类型
@Author:CSU张扬
@Email:csuzhangyang@gmail.com or csuzhangyang@qq.com
@我的网站: https://www.faker.top
2.1 基本内置类型
基本内置类型包括 算术类型 和 空类型 。
2.1.1 算术类型(arithmetic type)
算术类型的分类
内置类型 { 算术类型 { 整型 { 布尔值: b o o l 字符型: c h a r , w c h a r _ t , c h a r 16 _ t , c h a r 32 _ t 整型数: s h o r t , i n t , l o n g , l o n g l o n g 浮点型: f l o a t , d o u b l e , l o n g d o u b l e 空类型 ( v o i d ) text{内置类型}left{ begin{array}{l} text{算术类型}left{ begin{array}{l} text{整型}left{ begin{array}{l} text{布尔值: }bool\ text{字符型: }char, wchar_t, char16_t, char32_t\ text{整型数: }short, int, long, long long\ end{array} right.\ text{浮点型: }float, double, long double\ end{array} right.\ text{空类型}left( void right)\ end{array} right. 内置类型⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧算术类型⎩⎪⎪⎨⎪⎪⎧整型⎩⎨⎧布尔值: bool字符型: char, wchar_t, char16_t, char32_t整型数: short, int, long, long long浮点型: float, double, long double空类型(void)
算术类型的尺寸
算术类型的尺寸在不同机器上有所差距,下表列出 C++ 标准规定的尺寸的最小值。
| 类型 | 含义 | 最小尺寸 |
|---|---|---|
| bool | 布尔类型 | 未定义 |
| char | 字符 | 8位 |
| wchar_t | 宽字符 | 16位 |
| char16_t | Unicode字符 | 16位 |
| char32_t | Unicode字符 | 32位 |
| short | 短整形 | 16位 |
| int | 整形 | 16位 |
| long | 长整形 | 32位 |
| long long(C++11) | 长整形 | 64位 |
| float | 单精度浮点数 | 6位有效数字 |
| double | 双精度浮点数 | 10位有效数字 |
| long double | 扩展精度浮点数 | 10位有效数字 |
注意:
- 一个
char大小和一个机器字节一样。 - C++规定,一个
int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。 - 通常,
float为32位,double为64位,long double为96位或128位。类型float和double分别有7和16个有效位。
带/无符号类型
int,short,long,long long都是带符号的,在他们前面加上unsigned就可以得到无符号类型。
注意:类型unsigned int可以缩写为unsigned。- 字符型分为三种:
char,signed char,unsigned char。因为类型char是无符号还是带符号的,对于不同编译器来说,是不同的。
注意:如果你需要一个不大的整数进行运算(算术表达式),明确指定它是signed char或者unsigned char。
如何选择类型
- 明确知道数值不可能为负时,选无符号类型。
- 使用
int进行整数运算。 - 在算术表达式中,不要使用
char或bool。如果你需要一个不大的整数进行运算(算术表达式),明确指定它是signed char或者unsigned char。 - 执行浮点数运算选用
double。因为float精度不够且两者计算代价相差无几。
2.1.2 类型转换
六种类型转换的情况
- 非布尔->布尔:值为 0 则转换为
false,否则为true。 - 布尔->非布尔:值为
flase则转换为 0 ,值为true则为 1 。 - 浮点数->整数:去掉小数,只取整数部分。
- 整数->浮点数:小数部分记为 0 。若整数超过了浮点数的容量,精度可能会损失。
- 当赋给 无符号类型 一个超出它范围的数,结果是该数对 无符号类型表示数值总数 取模后的余数。例如:
unsigned char c = -1,实际结果是对256取模后的余数,即255。 - 当赋给 带符号类型 一个超出它范围的数,结果是未定义的。程序可能继续工作、可能崩溃,也可能产生垃圾数据。
例如:用g++运行int b = INT_MAX + 1;, 输出b = INT_MIN = -2147483648。这意味着在某些编译器下,含有无法预知的行为的程序也能正确执行。
含有无符号类型的表达式
当一个表达式既有无符号数,又有 int 值时,那个 int 值就会转换成无符号数。
把负值转化成无符号数,相当于给一个无符号数赋一个负值,参考上述 5。
例1:
unsigned u = 10;
int i = -42;
cout << u + i << endl;
假设 int 为32位,输出
2
32
−
42
+
10
=
4294967264
2^{32}-42+10=4294967264
232−42+10=4294967264 。
例2:
unsigned u = 1;
int i = -1;
cout << u * i << endl;
假设 int 为32位,输出
(
2
32
−
1
)
×
1
=
4294967295
(2^{32}-1) times 1=4294967295
(232−1)×1=4294967295 。
2.1.3 字面值常量(literal)
形如 -42 的值被称作 字面值常量 。
整型、浮点型、字符、字符串、布尔、指针字面值
整型字面值可以写作十进制数、八进制数、十六进制数。默认情况下,十进制字面值是带符号数,八进制和十六进制字面值即可能是带符号,也可能是无符号的。
十进制字面值是 int, long, long long 中,最小的那个,前提是能容纳下当前的值。
八进制和十六进制字面值是 int, long, long long, unsigned int, unsigned long, unsigned long long 中,最小的那个,前提是能容纳下当前的值。
若最大的数据类型都放不下,将产生错误。
注意: 类型 short 没有对应的字面值。
默认的,浮点数字面值是一个 double 类型。浮点数字面值表现为一个小数或者科学计数法。
3.14159 ; 2.14159E0 ; 0. ; 0e0 ; .001 。
由单引号括起来的一个字符成为 char 型字面值,双引号括起来的零个或多个字符则是字符串字面值。
true 和 false 是布尔类型的字面值。
nullptr 是指针字面值。
转义序列
- 不可打印字符:退格等控制字符
- 特殊含义的字符:单双引号、问号、反斜线等
C++规定的转义序列:
n ta v b " \ ? ' r f
泛华的转义序列,形式是 x 后跟1个或多个十六进制数,或者 后跟着1个、2个、3个八进制数。
例如:7(响铃) 12(换行) 40(空格) x4d(字符M)
若反斜线 后跟的八进制数超过三个,只有前3个构成转义序列。
例如:1234,表示八进制数 123 对应的字符和数字 4 。
x 则会用到后面跟的所有数,不过大多数机器 char 只有8位,x 也不会跟着很多数,超过可能会报错。
指定字面值的类型
字符和字符串字面值:
| 前缀 | 含义 | 类型 |
|---|---|---|
| u | Unicode 16字符 | char16_t |
| U | Unicode 32字符 | char32_t |
| L | 宽字符 | wchar_t |
| u8 | UTF-8(仅用于字符串字面常量) | char |
整型字面值:
| 后缀 | 最小匹配类型 |
|---|---|
| u 或 U | unsigned |
| l 或 L | long |
| ll 或 LL | long long |
浮点型字面值:
| 后缀 | 类型 |
|---|---|
| f 或 F | float |
| l 或 L | long double |
注意:
- 对于一个整型字面值来说,我们指定的是最小匹配类型,依据当前值选择最小的尺寸。
- 我们还行组合后缀使用,例如
UL为后缀,将根据具体数值选取unsigned long还是unsigned long long。
最后
以上就是无私面包最近收集整理的关于C++Primer(5th) Notes - 2.1 基本内置类型的全部内容,更多相关C++Primer(5th)内容请搜索靠谱客的其他文章。
发表评论 取消回复