计算机以比特序列存储数据,可寻址的最小内存块称位“字节(byte)”,存储的基本单元称为”字(word)“。
类型决定了数据所占的比特数以及该如何解释这些比特的内容,规定了其对象的存储要求和所能执行的操作。类型分为常量和非常量。
C++算术类型(arithmetic type)的尺寸在不同的机器上有所差别,C++标准只规定了这些算术类型的尺寸的最小值,并规定:一个int
至少和一个short
一样大,一个long
至少和一个int
一样大,一个long long
至少和一个long
一样大。
类型 | 含义 | 最小尺寸 |
---|---|---|
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位有效数字 |
带符号类型和无符号类型:带符号类型(signed
)可表示正数、负数和0,约定在其表示范围内正值和负值量应该平衡;无符号类型(unsigned
)仅能表示大于等于0的值。
int
、short
、long
和long long
都是带符号的,对应无符号类型位unsigned int
、unsigned short
、unsigned long
和unsigned long long
。
字符型分char
、signed char
和unsigned char
三种。但是表现形式只有两种signed
和unsigned
,由编译器来决定。
大多数类型支持类型转换,即一种类型的值转变为另外一种类型值:
- 非bool型转bool类型时,初始值为0则结果为false,否则为true;
- bool类型转非bool类型,初始值为false则结果为0,否则为1;
bool b = 42; // b为真
int i = b; // i = 1
- 浮点数赋值给整数类型,结果仅保留浮点数中小数点之前的部分;
- 整数值赋值给浮点类型时,小数部分记为0(如果整数所占空间超过浮点类型的容量有可能损失精度);
int i = 3.14; // i = 3
double d = i; // d = 3.0
- 赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数;
- 赋给带符号类型一个超出它表示范围的值时,结果是未定义的。
unsigned char c = -1; // 假设char占8比特, c = 255
signed char c2 = 256; // 假设char占8比特,c的值是未定义的
字面值常量(literal)也有其对应的数据类型,由字面值常量的形式和值决定。整型字面值有十进制、八进制和十六进制三种形式,比如数值20:
20 // 十进制
024 // 以0开头的的整数代表八进制
0x14 // 以0x或0X开头代表十六进制
符号 | 类型 | |
---|---|---|
十进制 | signed | int 、long 和long long 中能容下当前值的尺寸最小者 |
八进制 | singed 或者unsigned | int 、unsigned int 、long 、unsigned long 、long long 和unsigned long long 中能容下当前值的尺寸最小者 |
十六进制 | singed 或者unsigned | int 、unsigned int 、long 、unsigned long 、long long 和unsigned long long 中能容下当前值的尺寸最小者 |
严格来说,十进制字面值不会是负数,形如-42
,负号表示对字面值取负值。类型short
没有对应的字面值。
浮点型字面值有小数表示和科学计数法表示两种形式:
3.14159 // 小数表示
3.14159E0 // 科学计数法表示
3.14159e0 // 科学计数法表示
单引号括起来的一个字符成为char型字面值,双引号括起来的字符称为字符串型字面值
'a' // 字符字面值
"a" // 字符串型字面值
"" // 字符串型字面值
字符串型字面值的类型实际上是由常量字符构成的数组,编译器在每个字符串结尾处添加一个空字符('\0'
),字符串型字面值的长度比它的内光荣多1,如:
“Hello,World!"
实际存储的内容为:
H | e | l | l | o | , | W | o | r | l | d | ! | \0 |
---|
可以通过给字面值添加前缀或者后缀改变字面值的默认类型
字符和字符串字面值 | 前缀 | 含义 | 类型 |
u | Unicode 16字符 | 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 | ||
浮点型字面值 | 后缀 | 类型 | |
f或F | float | ||
l或L | long double |
C++中有两类字符不能直接使用:不可打印字符和有特殊含义的字符。使用时需要用转义序列代替。转义已反斜线开头,后紧跟一个字符,或者不多于3个八进制数,或者字母x加上1个十六进制数。
字符 | 转移序列 | 字符 | 转移序列 | 字符 | 转移序列 |
---|---|---|---|---|---|
换行符 | \n | 回车符 | \r | 报警(响铃符) | \a |
纵向制表符 | \v | 横向制表符 | \t | 双引号 | \" |
反斜线 | \\ | 退格符 | \b | 单引号 | \’ |
问号 | \? | 进纸符 | \f |
布尔字面值有两个:true
和false
。
指针指面值nullptr
,可用来初始化一个空指针。