前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++类型转换

C++类型转换

作者头像
用户7272142
发布2023-10-11 21:16:00
1710
发布2023-10-11 21:16:00
举报
文章被收录于专栏:Republic博客Republic博客

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

将一种算数类型的值赋给另一种算数类型的变量时,C++++将进行转换

表达式中包含不同类型时

将参数传递给函数时 程序自己进行的转化叫自动转换,如果不理解这些转换,有些结果是无法理解的。

代码语言:javascript
复制
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

原来的值可能超出目标类型,一般只复制右边的字节(低字节)

{}方式进行初始化转换

与上面的初始化相比,{}有更严格的转换要求。列表初始化不允许缩窄,即变量的类型可能无法表示赋给他的值;例如不允许将浮点型转换为整型。允许的条件是编译器知道目标变量可以存储赋给的值。

代码语言:javascript
复制
#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是一个变量,他并不知道变量的大小,因此不可以转换。

表达式转换

当一个表达式出现两种不同的算数类型时,一些类型会出现时自当转换,其次,有些类型在与其他类型出现在表达式里面会被转换。

代码语言:javascript
复制
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) 强制类型转换不会改变转换变量本身,而是根据转换类型创建一个新的值。

代码语言:javascript
复制
char q = 'q';
cout<<(int)q

q将会输出q对应的ascii码 我们可以通过程序演示一下强制转换。

代码语言:javascript
复制
#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

这个关键词可以让编译器根据初始值的类型推断变量的类型。

代码语言:javascript
复制
auto n = 100;//int
auto x = 1.5;//double
auto y = 1.3e12L;//long double

但是这个关键词在创建基本简单情况时,会很容易出。auto x = 0;如果我们需要一个double 而编译器会认为他是一个int类型。

总结

image.png
image.png
本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • {}方式进行初始化转换
  • 表达式转换
  • 强制转换
  • auto
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com