2.1基本内置类型
C++定义了一套包括算术类型和空类型在内的基本数据类型。
2.1.1、算术类型
算术类型分为两类:整型(integer type,包括字符和布尔类型在内)和浮点型。
类型 | 含义 | 最小尺寸 |
---|---|---|
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,扩展字符集有:wchar_t,char16_t,char32_t,wchar_t。
C++规定一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大。long long是C++11中的最新特性。
浮点型可以表示单精度、双精度和扩展精度值。C++标准指定了一个浮点数有效位数的最小值,然而大多数编译器都实现了更高的精度。
带符号类型和无符号类型:
出去布尔型和扩展的字符型之外,其他整型可以划分为带符号的(signed)和无符号的(unsigned)两种。
带符号类型可以表示正数、负数或0,类型int、short、long和long long都是带符号的;无符号类型则仅能表示大于等于0的值,通常是在类型的前面加上unsigned,这样就可以得到无符号类型的值。
与其他类型不一样的是char型,被分为三种:char、signed char、unsigned char。特别值得注意的是:char和signed char并不一样。尽管是字符的表现形式却只有两种:带符号和无符号。具体使用哪种形式有编译器决定。
2.1.2、类型转换
当程序的某处我们使用了一种类型而其实对象应该取另一种类型时,程序会自动进行类型转换。
类型所能表示的值的范围决定了转换的过程:
1、当我们把一个非布尔类型的算术值赋值给布尔类型时,初始值为0则结果为false,否则结果为true。
2、当我们把一个布尔类型的赋给非布尔类型时,初识值为false则结果为0,初始值为true则结果为1.
3、当我们把一个浮点数赋给整数类型时,进行近似处理。结果值将仅保留浮点数中小数点之前的部分。
4、当我们把一个整数赋给浮点类型时,小数部分记为0。如果该整数所占的空间超过了浮点类型的容量,精度可能有损失。
5、当我们赋给无符号类型一个超出它表示的范围的值时,结果是初识值对无符号类型表示数值总数取模后的余数。
6、当我们赋给带符号类型一个超出它表示的值时,结果是未定义的(undefined)。此时程序可能继续工作、可能崩溃、可能生成垃圾数据。
2.1.3、字面值常量
一个形如42的值被称作字面值常量。
整型和浮点型的字面值常量
以0开头的代表八进制数,以0X开头的带表十六进制数,例如:以下几种形式都表示数值是20
20 十进制数 024 八进制数 0x14 十六进制数
如果我们使用一个形如-42的负十进制字面值,那个负号并不在字面值之内,它的作用仅仅是对字面值取负值而已。
浮点型字面值表现为一个小数或以科学计数法表示的指数,其中指数部分用E或e标识:
3.14159 3.14159E0 0. 0e0 .001
字符和字符串字面值
单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符则构成字符串类型字面值。
编译器在每个字符串的结尾处添加了一个空字符(‘\0’)
转义序列
C++转义序列包括:
换行符 \n 横向制表符 \t 报警(响铃)符 \a 纵向制表符 \v 退格符 \b 双引号 \"
反斜线 \\ 问号 \? 单引号 \' 回车符 \r 进纸符 \f
指定字面值的类型
L‘a’ u8“hi!” 42ULL 1E-3F 3.14158L
前缀 | 含义 | 类型 |
u | Unicode16字符 | char16_t |
U | Unicode32字符 | char32_t |
L | 宽字符 | wchar_t |
u8 | UTF-8(仅用于字符串字面常量) | char |
后缀 | 最小匹配类型 |
u or U | unsigned |
l orL | long |
ll or LL | long long |
后缀 | 类型 |
f或F | float |
l或L | long double |
- long double ld = 3.1415926536;
- int a{ld}, b = {ld}; //出错,不允许出现精度的丢失
- int c(ld), d = ld; // 非列表初始化,但是会出现精度的丢失