2.1 基本内置类型
2.1.1 算术类型
1、算术类型分为整型(字符型和布尔型也包括在内)和浮点型,C++标准规定了各类型尺寸的最小值,同时允许编译器赋予这些类型更大的尺寸。
2、对于整型,C++语言规定,long long ≥ long ≥ int ≥ short,short ≥ 16,int ≥ 16,long ≥ 32,long long ≥ 64,具体可以用sizeof()查看。
3、C++ 11中新定义了一个数据类型long long。
4、除去布尔型和扩展的字符型以外,其他整型可以划分为带符号的(signed)和无符号的(unsigned),无符号类型只能表示 ≥0 的数,它的所有位都用来存储值。
5、与其他整型不同,字符型被分为了三种:char,signed char和unsigned char。特别需要注意的是,类型char和类型signed char并不一样,尽管字符型有三种,但是字符的表现形式却只有两种:带符号的和无符号的。类型char具体会表现为哪种(signed or unsigned)由编译器决定。
6、建议:如何选择类型?
(1)当明确知晓数值不可能为负时,选用无符号类型
(2)使用int执行整数运算,如果数值超过了int,选用long long
(3)算术表达式中不要使用char或bool,如果你需要使用一个不大的整数,那么明确指定类型是signed or unsigned。
(4)执行浮点数选用double,这是因为float通常精度不够而且double和float的计算代价相差无几。long double提供的精度一般是没有必要的,而且它带来的运行时消耗也不容忽视。
7、unsigned int可以简写为unsigned。
8、C++的布尔型是bool,不是boolean。
2.1.2 类型转换
1、类型所能表示的值的范围决定了类型转换的过程:
(1)非布尔类型的值赋给布尔类型时,初始值为0,则结果为false,否则结果为true。
(2)布尔值赋给非布尔类型时,初始值为false,则结果为0,否则为1。
(3)浮点数赋给整型时,仅保留整数部分。
(4)整数赋给浮点型时,小数部分记为0,如果该整数所占的空间超过了浮点类型的容量,精度可能有损失(例如long long可能会超过float)。
(5)当我们赋给无符号类型一个超出它表示范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数,例如,把-1赋给8位的unsigned char会得到255。
(6)当我们赋给带符号类型一个超出它表示范围的值时,结果是未定义的(undefined),这时程序可能继续工作,可能崩溃,也可能生成垃圾数据。
2、建议:避免无法预知和依赖于实现环境的行为。无法预知的行为源于编译器无须或无法检测的错误,代码有可能编译通过,但执行时可能会产生错误(例如执行一条未定义的表达式)。有时,含有无法预知行为的程序也能正常运行,但不能保证同样一个程序在别的编译器下也能正常工作,甚至已经编译通过的代码再次执行也可能会出错。此外,也不能认为这样的程序对一组输入有效,对另一组输入也会有效。依赖于实现环境的行为会导致程序不可移植(nonportable),在移植后产生这种错误,要排查起来可不是一件轻松的工作。
3、提示:切勿混用带符号类型和无符号类型,当带符号类型取负值的时候会出现异常结果,这是因为带符号数会自动地转换成无符号数(即符号位变为数值位)。
2.1.3 字面值常量
1、每个字面值常量(literal)都对应一种数据类型,这由它的形式和值决定,对于每个字面值常量,都有默认情况下的类型,但我们也可以通过后缀来指定类型。
2、字符串字面量实际上是一个字符数组,编译器在每个字符串的结尾处添加一个空字符("\0")。
3、泛化的转义序列:\x后接1个或多个16进制数字,或\后接1个、2个或3个8进制数字。