c++ primer读书笔记—2.1 基本内置类型
基本数据类型包括算术类型(字符型、整型、浮点型、布尔型)和空类型
2.1.1 算术类型
1 算术类型包括字符型、整型、浮点型、布尔型,字符型、布尔型都可归为整型
算术类型的尺寸在不同机器上有所差异,即内置类型的大小与机器硬件密切相关
①字符类型:
a.基本字符类型:char
b.扩展字符类型:wchar_t,char16_t,char32_t
char,wchar_t,char16_t,char32_t的最小尺寸分别为8,16,16,32比特,允许编译器赋予这些类型更大的尺寸
②整型
short,int,long,long long最小尺寸分别为16,16,32,64比特,一个int至少和一个short一样大,一个long至少和一个int一样大,一个long long至少和一个long一样大,long long是c++11新特性
③浮点型
单精度 float:32个比特,7个有效位
双精度 double:64比特,16个有效位
扩展精度 long double:96或者128比特
2 比特、字节、字
大多数机器以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块即为字节。一个字节至少要能容纳机器基本字符集中的字符。
存储的基本单位是字,一般包括几个字节。
大多数机器的字节包含8个比特,字包含32或者64个比特,即4或8个字节
我们能够使用地址表示从这个地址开始的大小不同的比特串,为了赋予内存中某个地址具体含义,我们必须知道存储在该地址的数据的基本类型。
3 有符号类型和无符号类型
除了布尔型和扩展的字符型,其他整型可以划分为带符号型和无符号型。无符号类型的所有比特位都用来存储值。带符号类型约定了正值和负值的量应该均衡。
①整型:无符号类型需要在前面加unsigned。unsigned int可以缩写为unsigned
②字符型:char,signed char,unsigned char
char在有些机器中被理解为signed char,有些机器被理解为unsigned char
8比特的unsigned char的取值范围是0-255,8比特的signed char的取值范围是-128到127
4 选择类型的准则
①当取值不能为负时,用无符号类型。
②执行整数运算时使用int。如果数值超过了int的取值范围,使用long long类型。因为short的尺寸太小,而long和int具有相同的尺寸。
③在算术表达式中尽量不要使用char和bool。如果要使用char表示不大的整数,需要指明是signed char还是unsigned char。
④执行浮点数运算时选择double。因为float可能精度不够,而且双精度的计算代价和单精度的相差无几。一般不使用long double,因为其精度很高一般用不到,而且计算代价比较大。
2.1.2 类型转换
1 布尔型和非布尔型相互转换
非布尔型转布尔型:取值为0对应false,其余均为true。如果一个非布尔值用作条件,会被转换成布尔值。
布尔型转非布尔型:false对应0,true对应1。如果把布尔值用在算数运算中,其取值非0即1,一般不建议在算术运算中使用布尔型和char型。
2 整型和浮点型相互转换
整数型赋值给浮点型:小数部分取值为0。如果整数所占空间超过了浮点数的容量,精度可能会有损失。
浮点型赋值给整数型:仅保留浮点型小数点之前的部分。
3 给一个超出表示范围的值
①给无符号数一个超出表示范围的值:用该值除以该无符号数表示数字总数后取余。
②给带符号数一个超出表示范围的值:结果未定义
4 可移植性:避免依赖于实现环境的行为。
5 含有无符号类型的表达式
①如果表达式中同时含有int和无符号型,会把int转换成无符号型,转换方式是用该值除以该无符号数表示数字总数后取余
②无符号数的运算结果不会小于0,如果小于0会将其转换成无符号型
③在写循环时一定要注意无符号数不会小于0,避免出现死循环
总之,如果表达式中既有无符号数,也有带符号数,会先把带符号数转换成无符号数再进行运算。如果表达式是无符号数的运算,要求运算结果也必须是无符号数,如果结果不是,会被转换成无符号数。
三 字面值常量
1 整型和浮点型字面值
①整型字面值可以写成十进制、八进制(以0开头)、十六进制(以0x开头)的形式。
十进制字面值默认是带符号类型,取能容纳其取值的int,long,long long中的最小尺寸
八进制和十六进制可能是带符号类型,也可能是无符号类型的,取能容纳其取值的int,unsigned int,long,unsigned long,long long,unsigned long long中最小尺寸
类型short没有字面值。
②浮点型字面值一般写成小数或科学计数法(指数部分用e或者E表示)的形式。浮点型字面值默认为double类型。
2 字符和字符串字面值
区分字符字面值和字符串字面值的是单引号还是双引号。
字符串字面值实际是由字符常量组成的数组,编译器会在其结尾加一个空字符(‘\0’),字符串字面值的长度比其实际长度加一。
如果两个字符串字面值仅由空格、换行符、缩进隔开,它们实际是一个字符串。
3 转义字符
输出具有特殊含义的字符,以‘\’开头
泛化的转义序列:+一个或多个十六进制数 或者 +1到3个八进制数,数字部分表示字符对应的数值
4 布尔类型和指针类型字面值
true和false是布尔类型的字面值
nullptr是指针类型的字面值
5指定字面值类型
①通过前缀来指定字符字面值的类型
u——面向unicode的char16_t
U——面向unicode的char32_t
L——wchar_t(尽量不使用小写字母l,l太容易与1混淆了)
u8——面向UTF-8的char
②通过后缀来指定整型、浮点型字面值的类型
整型字面值后缀
u/U——unsigned
l/L——字面值的类型至少是long
ll/LL——long long
浮点型字面值后缀
f/F——float
l/L——long double