基本内置类型包含算术类型和空类型。算术类型有包括字符/整数/浮点数/bool类型
类型 | 含义 | 最小位宽 |
bool | 布尔类型 | 未定义 |
char | 字符类型 | 8bit |
wchar_t | 宽字符 | 16bit |
char16_t | Unicode字符 | 16bit |
char32_t | Unicode字符 | 32bit |
short | 短整型 | 16bit |
int | 整形 | 16bit(在32/64位机器上是32bit) |
long | 长整型 | 32bit |
long long | 长整型 | 64bit |
float | 单精度浮点型 | 6位有效数字 |
double | 双精度浮点型 | 10位有效数字 |
long double | 扩展精度浮点型 | 10位有效数字 |
1. bool类型的取值是true或false
2. int/short/long都带有符号,char是否带符号与编译器有关,建议使用signed char或unsigned char
3. 无符号类型只能表达非负数
4. Cpp提供了多种字符类型:
a) char:一个char空间应确保可以存放机器基本字符集中任意字符对应的数值,即1个char=1个机器字节
b) wchar_t:宽字符,用于扩展字符集,wchar_t确保可以存放机器最大扩展字符集中的任意一个字符
c) char16_t & char32_t:为Unicode字符集服务
5. 类型选择建议:
a) 确定数据为非负数时,选用unsigned类型
b) 整数运算用int,数值太大时用long long
c) 算术表达式不要使用char和bool类型
d) 浮点运算用double,因为在计算机上float和double的计算代价相差不多
1. 原则:
a) 把非bool型的算术值赋给bool型,初始值为0则结果为false,否则结果为true
b) 把bool型赋给非bool型时,初始值为false则结果为0,否则结果为1
c) 把浮点数赋给整数类型时,结果值仅保留浮点数中的整数部分
d) 把整数值赋给浮点类型时,小数部分记为0。如果整数所占空间超过了浮点型的容量,可能带来精度损失
e) 赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数(例如8bit能表示的数值是0-255,即总数是256)取模后的余数
f) 赋给有符号类型一个超出范围的值,属于undefined behavior
g) 程序尽量避免依赖于实现环境的行为,例如int的尺寸在不同环境可能不同
2. 表达式中既有无符号数又有有符号数时,有符号数会被转换成无符号数
3. 无符号数不会小于0这一事实关系到循环的写法
for (unsigned u = 10; u >= 0; --u)
std::cout << u << std::endl; //此处for循环条件将永远成立
1. 整形和浮点型字面值
a) 整形字面值中以0开头的代表八进制数,以0x或0X开头的代表十六进制数,以0b或者0B开头的为二进制数。C++14新增了单引号'形式的数字分隔符。数字分隔符不会影响数字的值,但可以通过分隔符将数字分组,使数值读写更容易。
std::cout << 0B1'101; // 输出"13"
std::cout << 1'100'000; // 输出"1100000"
b) 默认情况十进制字面值为有符号型
c) 浮点型字面值默认时double型,可以用小数或者科学计数法表示,科学计数法中的指数部分用E或e标识
1.2 .003 1.23E2 0e0
2. 字符和字符串字面值
a) 由单引号括起来的一个字符称为char型字面值,双引号括起来的零个或多个字符称为字符串字面值
b) 字符串字面值的类型是由常量字符构成的数组(array)。编译器在每个字符串的结尾处添加一个空字符' ',因此字符串字面值的实际长度要比它的内容多一位,这里需要注意常用函数strlen和运算符sizeof的区别,对于字符数组,strlen计算的是不包含‘ ‘的长度,而sizeof计算的是包含’ ‘的长度
3. 转义序列
含义 | 转义字符 |
newline |
|
horizontal tab |
|
alert (bell) | a |
vertical tab | v |
backspace | b |
double quote | " |
backslash | |
question mark | ? |
single quote | ' |
carriage return | r |
formfeed | f |
4. 泛化转义序列:形式是x后紧跟1个或多个十六进制数字,或者后紧跟1个、2个或3个八进制数字,其中数字部分表示字符对应的数值。如果后面跟着的八进制数字超过3个,则只有前3个数字与构成转义序列;相反,x要用到后面跟着的所有数字。