C++类型转换

2023-10-11 21:16:00 浏览数 (1)

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

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

总结

0 人点赞