C++类型转换

因为需求不同我们可以选择不同的类型,我们在计算不同类型的数据时,需要用到类型转换。

  • 将一种算数类型的值赋给另一种算数类型的变量时,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类型。

总结

image.png

网站标题:CV鼻祖洋芋

原创文章,作者:locus,如若转载,请注明出处:https://blog.cvpotato.cn/forward-code/c/190/

本博客所发布的内容,部分为原创文章,转载注明来源,网络转载文章如有侵权请联系站长!

(0)
上一篇 6天前
下一篇 6天前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注