因为需求不同我们可以选择不同的类型,我们在计算不同类型的数据时,需要用到类型转换。
- 将一种算数类型的值赋给另一种算数类型的变量时,C++将进行转换
- 表达式中包含不同类型时
- 将参数传递给函数时
程序自己进行的转化叫自动转换,如果不理解这些转换,有些结果是无法理解的。
long l_long;
short s_short;
l_long = s_short;
我是win10 64位 所以short需要接受long的数据,则自身16位需要扩展为32位,会得到一个新值,而s_short的内容不变。将一个值赋值给取值范围更大的类型不会导致什么问题,例如把short的值赋值给long,并没有改变这个值,而是占用了更大的空间而已。如果将一个很大的值long赋值给float将会降低精度,因为只能最低保证六位有效位,所以会得到一个四舍五入的值。
转换存在的问题
转换 | 潜在的问题 |
---|---|
double->float | 数据有效位降低,结果不确定 |
float->int | 小数部分丢失,结果不确定 |
long->short | 原来的值可能超出目标类型,一般只复制右边的字节(低字节) |
{}方式进行初始化转换
与上面的初始化相比,{}有更严格的转换要求。列表初始化不允许缩窄,即变量的类型可能无法表示赋给他的值;例如不允许将浮点型转换为整型。允许的条件是编译器知道目标变量可以存储赋给的值。
#include<iostream>
using namespace std;
int main()
{
const int code = 66;
int x = 66;
char c1{ 31325 };//超出范围
char c2={ 66 };
char c3{ code };
char c4 = { x };
x = 31325;
char c5 = x;
}
c4初始化时,编译器并不会通过,因为在编译器看来,x是一个变量,他并不知道变量的大小,因此不可以转换。
表达式转换
当一个表达式出现两种不同的算数类型时,一些类型会出现时自当转换,其次,有些类型在与其他类型出现在表达式里面会被转换。
short chicken = 20;
short ducks = 35;
short fowl = chicken+ducks;
转换过程为,先把chicken和ducks转换成int 然后相加结果再转换为short,因为int是计算机最自然的类型,如果short比int短,则unsigned类型将被转换为int 如果长度相等,则unsigned short类型被转换为unsigned int,确保了数据转换时,不会丢失数据。
不同数据类型尽心运算时候,也会进行一些转换,例如将int和float相加时,当涉及两种类型时,较小的类型会被转为较大的类型
VS2019的C++语言标准默认为C++14。
这里总结一下C++自动转换的规则
- 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。也是小转大
a、若两种类型的字节数不同,转换成字节数高的类型
b、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型 - char型和short型参与运算时,必须先转换成int型。
- 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。
- 如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度
强制转换
C语言转换(typename) value
C++转换 typename (name)
强制类型转换不会改变转换变量本身,而是根据转换类型创建一个新的值。
char q = 'q';
cout<<(int)q
q将会输出q对应的ascii码
我们可以通过程序演示一下强制转换。
#include<iostream>
int main()
{
using namespace std;
int auks, bats, coots;
auks = 19.99 + 11.99;
bats = int(19.99) + int(11.99);
coots = (int)19.99 + (int)11.99;
cout << "auks = " << auks
<< "bats = " << bats
<< "coots = " << coots << endl;
char ch = 'Z';
cout << "the code for" << ch << "is";
cout << int(ch) << endl;
cout << "the code is ";
cout << static_cast<int>(ch) << endl;
return 0;
}
首先,将19.99和11.99相加,结果为31.98。这个值赋给int变量auks时,被截短为31。如果是强转的话,两个值分别被截短为19和11.同样的字符也是转为整数,打印存储在ch中的Ascii码。
auto
这个关键词可以让编译器根据初始值的类型推断变量的类型。
auto n = 100;//int
auto x = 1.5;//double
auto y = 1.3e12L;//long double
但是这个关键词在创建基本简单情况时,会很容易出。auto x = 0;如果我们需要一个double 而编译器会认为他是一个int类型。
总结
网站标题:CV鼻祖洋芋
原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/forward-code/c/190/
本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!