C++的基本内置类型包含空类型和算术类型。
算术类型包含:字符类型、整型数、浮点值、布尔值。
算术类型
算术类型分为两大类:整型,包含字符和布尔类型在内;浮点型。

- 一个
char的大小和一个机器字节一样。 wchar_t确保可以存放机器最大扩展字符集中的一个字符。char16_t、char32_t为Unicode字符集服务。int至少和short一样大。long至少和int一样大。long long至少和long一样大,long long是C++11新定义的。- 计算机可以寻址的最小内存块称为字节,存储的基本单元称为字,一个字通常由几个字节构成,大多数计算机中一个字节包含8个比特,一个字包含4个或者8个字节。
- 浮点型分为单精度、双精度、扩展精度,通常
float以1个字表示,double以两个字表示,long double以3个或者4个字表示。
带符号类型和无符号类型
除了布尔类型和扩展的字符类型之外,其它整型可以划分为带符号和无符号的。
字符型分为三种:char、signed char、unsigned char。但是表现形式只有两种:带符号的,无符号的。char 类型具体是上述两种类型中的哪一种由编译器决定。
如何选择类型
- 明确知道数值不可能为负时,选用无符号类型。
- 使用int执行整数运算,实际应用中,
short常常显得更小,long一般和int拥有一样的尺寸,如果数值超过了int,选用long long。 - 算术表达式中不要使用char或bool。如果需要使用
char类型,一定要明确指出是signed char还是unsigned char。 - 执行浮点运算选用
double,这是因为float通常精度不够并且双精度浮点和单精度浮点在计算代价上相差无几,甚至在一些机器上双精度要比单精度更快。long double提供的精度通常是不必要的,而且它带来的运行时消耗也比较大。
类型转换
对象的类型定义了对象能包含的数据和能参与的运算。类型转换是大多数类型所支持的运算。
当程序在某处使用一种类型,而实际上应该使用另一种类型的时候,程序会自动进行类型转换。
类型所能表示的范围决定了转换过程:
- 非布尔类型赋值给布尔类型,初始值为0则结果是
false,否则结果为true。 - 把布尔值赋值给非布尔值时,初始值是
false则结果为0,初始值为true则结果是1。 - 浮点数赋值给整数时,结果值仅保留浮点数中小数之前的部分。
- 把整型数赋值给浮点类型时,小数部分记为0,如果该整数所占的空间超过了浮点类型的容量,精度可能会有损失。
- 当给无符号类型赋值一个超出其表示范围的值,结果是初始值对无符号类型表示数值总数取模之后的余数。例如把
-1赋值给unsigned char类型,其结果将是255。 - 当给带符号类型一个超出其范围的值,结果将是未定义的,此时程序可能继续工作、可能崩溃、也可能生成垃圾数据。
- 有符号数转换成无符号数时,负数转换成大的正数,相当于在原值上加上了无符号数能够表示的最大数据范围,正数保持不变。
unsigned u = -10;
cout<<u<<endl; //相当于u + UINT_MAX + 1
- 无符号数转换成有符号数时,对于较小的数将保持原值,对于较大的数将转换成负数,相当于原值减去无符号数表示的最大数据范围。
unsigned u = UINT_MAX;
int i = u;
cout << i << endl; //相当于 u - (UINT_MAX+1)
- 当表达式中存在有符号和无符号类型时,所有操作都自动转换成无符号类型。
unsigned u = 10;
int i = -42;
cout << i + u << endl; //UINT_MAX + 1 - 42 + 10
注意:
无符号数错误的使用在循环语句中,导致死循环:
for(unsigned u=10;u>=0;u--)
{
....
}
字面值常量
整型和浮点型字面值
- 整型字面值可以有十进制,八进制(0),十六进制(0x)。
- 默认情况下,十进制字面值是带符号数,八进制和十六进制字面值可能带符号也可能无符号。
- 十进制字面值是
int、long、long long中尺寸最小的那个,前提是这种类型包含当前值。 - 八进制和十六进制字面值的类型是容纳其数值的
int、unsigned int、long、unsigned long、long long、unsigned long long。 - short 没有对应的字面值。
- 浮点型字面值可以采用小数形式,或者科学计数法表示 (E,e)。
- 默认情况下,浮点字面值是
double类型。
字符和字符串字面值
- 单引号括起来的是
char型字面值,双引号括起来的是字符串字面值。 - 字符串字面值的类型实际上是由常量字符组成的数组,编译器在每个字符串的结尾处添加一个空字符(' '),所以字符串字面值实际长度要比它的内容多1。
- 分多行书写字符串字面值:
cout << "I am so happy,"
"today" << endl;
转义序列
两类字符程序员不能直接使用:
- 不可打印字符,如退格或其他控制字符,因为它们没有可视化图符。
- C++ 语言中含有特殊含义的字符(单引号,双引号,问号,反斜线)。
对于以上两种强开,需要用到转义序列,转义序列都是以反斜线开始:

也可以使用泛化的转义序列,其形式是 x 后紧跟一个或者多个十六进制数,或者 后紧跟一个、两个、三个八进制数字,其中数字部分表示的字符对应的数值,

注意:
- 如果反斜线
后面跟着的八进制数字超过3个,只有前3个数字与构成转义序列。
指定字面值的类型

布尔字面值和指针字面值
true和false是布尔字面值。nullptr是指针字面值。