概述
- 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) Notes - 2.1 基本内置类型所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复