C++11新增的内容:char16_t和char32_t
- char16_t:
- 无符号,16位,使用前缀u表示char_16字符常量和字符串常量;
- char32_t:
- 无符号,32位,使用前缀U表示char32_t常量
浮点类型
C++有三种浮点类型:float、double、long double
头文件cfloat
中对对浮点数进行了限制:
比如最低有效位数、表示尾数的位数和最大和最小的指数值~
超过有效位数,显示的数据可能就不精确了(比如上图中的系统限制float的有效位数为6,如果终端显示的数字超过6位,就会产生错误)
浮点常量的存储:默认情况下,像8.24和2.4E8这样的浮点常量都属于double类型.
如果希望存储为float类型,在常量后面添加f或F后缀;如果希望存储为long double类型,可使用l或L后缀
浮点数运算的速度通常要比整数运算慢:
cfloat头文件中定义的float有效位数为6(自己尝试去找了一下,看了一下头文件,不要觉得头文件是神秘的东西,多去看)
#include <iostream>
#include <cfloat>
int main()
{
using namespace std;
//先看一下系统中规定的float类型的有效位数
cout << "the significiant digits of (float) is " << FLT_DIG << endl;
//精度降低的示例
cout.setf(ios_base::fixed,ios_base::floatfield);//迫使输出使用定点表示法
float a = 2.34E+22f;
float b = a + 1.0f;//默认存储为double,这里需要float,需要使用f后缀
cout << "a=" << a << endl;
cout << "b-a=" << b - a << endl;
return 0;
}
如上图,有效位数为6,下面一行输出也表明,a的值从第七位开始就开始出错,而前六位是正确的。
b-a的值正确应该为1(末尾位加一),但是由于float只能表示前六位或前七位,修改末尾位对这个数没有影响。
除法
两个操作数都是整数时,结果为整数;只要有一个操作数为浮点数,结果就是浮点数。
对不同类型进行运算时,C++将他们全部转换为同一类型。
以{}方式进行初始化时的类型转换
这种初始化的方式对于类型转换比较严格。不允许缩窄(我的理解是大的不能转换为小的)。比如
int x=66;
char c = {x};
在编译器看来,char类型容不下int类型,所以不允许转换。
但是
x=36325
char c = x
这样通常的初始化是允许的,但是会超出目标类型的取值范围,通常只取右边的字节,会损失精度。
表达式中的类型转换
- 在计算表达式时,C++会将bool、char、unsigned char、signed char和short转换为int类型!(整型提升)
short s1;
short s2;
short s3 = s1 + s2;
- 在计算s3时,会将s1和s2转换为int类型,然后再将结果转换为short类型(因为结果被赋给一个short变量)
- 当不同类型进行算术运算,也会进行转换。
- 会将小的转换为大的(如int和float进行运算,int被转换为float)
- 如果一个操作数为有符号的,另一个为无符号的,且无符号的级别高于有符号的级别,则将有符号的转换为无符号所属的类型。
- 如果有符号的类型能表示无符号类型的所有可能取值,则将无符号操作数转换为有符号的类型
- 否则,将两个转换为有符号所属类型的无符号版本
上述转换只考虑等号右边的操作数,与左边结果变量的类型无关~
auto声明(自动判断类型)
auto x = 123.1;
,这样x是int类型,使用auto声明不指定变量的类型,编译器将变量的类型设置为与初始值相同
主要是为一些复杂的类型处理设计的(比如STL里面的类型,现在还一知半解,学习到后面应该会清晰)