国内最先做弹幕的网站/凡科网怎么建网站
目录
- 1 概述
- 2 算数类型
- 3 带符号类型和无符号类型
- 4 字面值常量
- 4.1 整型字面值
- 4.2 浮点字面值
- 4.3 字符字面值
- 4.4 字符串字面值
- 4.5 布尔字面值
- 4.6 指针字面值
- 4.7 指定字面值类型
- 5 类型转换
- 5.1 赋值时
- 5.2 计算表达式时
- 6 References
1 概述
内置类型包括算数类型和空类型,其中空类型不对应任何具体的值,仅用于一些特殊的场合。
2 算数类型
算数类型分为两类:整型和浮点型。
类别 | 类型 | 含义 | 最小尺寸 |
---|---|---|---|
整型 | 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位有效数字 |
注意:char的大小和一个机器字节一样;long long是C++11新定义的数据类型;浮点数通过有效位数来确定尺寸,而不是位数。
3 带符号类型和无符号类型
除了布尔型和扩展的字符型之外,其他整型可划分为带符号型的(signed) 和 无符号型的(unsigned)。
类型 | 默认 |
---|---|
char | 编译器决定 |
short | signed |
int | signed |
long | signed |
long long | signed |
4 字面值常量
字面值分为:整型字面值,浮点型字面值,字符字面值,字符串字面值,布尔字面值和指针字面值。
4.1 整型字面值
整数字面值分为十进制,八进制和十六进制。
整数字面值默认值十进制;如果以0开头,则为十进制;如果以0x或0X开头,则为十六进制。
十进制类型默认是带符号整数,在int、long和long long中选择一个尺寸最小的。
八进制和十六进制在int、unsigned int,long,unsigned long,long long和unsigned long long中选择一个尺寸最小的。
如果字面值过大,以至于最大尺寸的数据类型都放不下,则会报错。
《c++ primer》对整型字面值有一个奇葩的解释:严格来说十进制字面值不会是负数,如果我们使用了一个形如-42的负十进制字面值,那个负号并不在字面值之内,它的作用仅仅是对字面值取负值而已。
上述的解释看似比较奇怪,但是深入思考之后,还是有点道理。与其将负号作为整型字面量的一部分,不如将其作为一个运算符。
4.2 浮点字面值
浮点型表现为一个小数或以科学计数法表示的指数,其中指数部分用E或e标识。
举例:3.14159 | 3.14159E0 | 0. | 0e0 .001
默认浮点型字面值是一个double。
4.3 字符字面值
用单引号括起来的一个字符称为char型字面值。
顺便在这里介绍一下转义序列。
通常我们用转义序列来表示不可打印的字符和有特殊含义的字符。
字符 | 转义序列 |
---|---|
换行符 | \n |
纵向制表符 | \v |
反斜线 | \\ |
回车符 | \r |
横向制表符 | \t |
退格符 | \b |
问号 | \? |
进纸符 | \f |
报警(响铃)符 | \a |
双引号 | \" |
单引号 | \' |
也可以用泛化的转义序列来表示其他字符,其形式是\x(注意不要用\X)后紧跟1个或多个十六进制数字,或者\后紧跟1个、2个或3个八进制数字,其数值部分表示的是字符对应的数值。
4.4 字符串字面值
双引号括起来的零个或多个字符则构成字符串型字面量。
字符串字面量的类型实际上是有常量字符构成的数组(array)。编译器会在每个字符串的结尾处添加一个空字符(’\0’),因此,字符串字面量值的实际长度要比它的内容多1。
很重要的一点:如果两个字符串字面量位置紧邻且仅有空格、缩进和换行符分隔,则它实际上是一个整体。请看下面示例。
std::cout << "a really, really long string literal ""that spans two lines" << std::endl;
4.5 布尔字面值
布尔字面值只有两个:true和false。
4.6 指针字面值
常见的指针字面值为nullptr,表示空指针,可以转化成任意其他的指针类型。也可以通过0或NULL来初始化空指针,其中NULL是头文件cstdlib中定义的预处理变量。
4.7 指定字面值类型
除了默认字面值类型之外,还可以强行指定字面值类型。
字面量类型 | 后缀或后缀 | 类型 |
---|---|---|
字符字面值 | u(前缀) | char16_t |
U(前缀) | char32_t | |
L(前缀) | wchar_t | |
字符串字面值 | u(前缀) | char16_t |
U(前缀) | char32_t | |
L(前缀) | wchar_t | |
u8(前缀) | char | |
整型字面值 | u or U(后缀) | unsigned |
l or L(后缀) | long | |
ll or LL(后缀) | long long | |
浮点型字面值 | f or F(后缀) | float |
l or L(后缀) | long double |
5 类型转换
由于类型转化涉及的内容比较多,这里不做过多的介绍,之后会用一章详细介绍类型转换。
5.1 赋值时
- 用非布尔类型赋给布尔类型时,初始值为0则结果为false,否则结果为true。
- 用布尔类型赋给非布尔类型时,初始值为false则结果为0,否则结果为1。
- 用浮点类型赋给整数类型时,仅保留小数点之前的部分。
- 用整数类型赋给浮点类型是,小数部分记为0,如果整数所占的空间超过了浮点类型的容量,则精度可能有损失。
- 当无符号类型超出范围时,其结果是初始值对无符号类型表示数值总数取模后所得的余数。
- 当带符号类型超出范围时,其结果是未定义的。
5.2 计算表达式时
带符号类型会自动转化为无符号类型。
6 References
[1] Stanley B. Lippman. C++ Primer[M]. 电子工业出版社, 2013.