隐式转换和显式转换

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了隐式转换和显式转换相关的知识,希望对你有一定的参考价值。

C/C++对于数据类型的转换包括隐式转换和显式转换(强制类型转换)。

一般来说,隐式转换包括以下几种情形:

1. 低精度与高精度混合运算,低精度会隐式转换成高精度类型。

int a = 10;
double b = 1.2;
double c = a + b;//此时a会隐式转换成double类型进行运算。

bool、char、short、int、long、float、double依次向上会发生隐式转换。bool类型向上转换时,false转换成0,true转换成1。

【p.s.】有符号和无符号数之间的转换。当signed类型能够容纳类型转换前的数时,该类型向上转换时转换为signed类型,否则都转换成unsigned类型。

有符号数和无符号数之间的转换会发生符号反转或数据截断。

符号反转是只无符号数与有符号数之间运算,会导致符号发生变化;

数据截断则是指高精度数据用低精度类型保存数据时,发生的高位/低位数据被舍弃的现象。

int a = 300;
char b = a;//发生数据截断 b的ascii码是44,实际对应的是,
int c = b;//char隐式转换成int 44

unsigned short d = 10;
unsigned short e = 65535;
short f = d + e;//65545,被截断f=9

short aa = 10;
short bb = 32767;
short cc = aa + bb;// cc=-32759

 

2. 非布尔类型会转换成布尔类型。

int a = 10;
if (a)//这里会将非0值认为是true
{
    cout << "i am true."  << endl;
}
else
{
    cout << "i am false." << endl;
}

 

3. 指针类型转换。

数组名会转换成指针。当数组作为函数形参时,本身是蜕化成指针的。

可以将NULL(0)赋值给指针类型。

 

4. 枚举类型。

枚举类型的取值可以与整形进行转换。

 

C风格的强制转换,在类型前加上(c_type)。如,将double类型强制转换成int:

double pi = 3.1415926;
int p = (int) pi;// p = 3

C++风格的强制转换

static_cast<type>、const_cast<type>、dynamic_cast<type>、reinterpret_cast<cast>

通常编译器支持的自动转换,都可以在前面加上static_cast。高精度数据转换成低精度数据时,编译器通常会给出精度损失的告警,
使用static_cast强制转换时,编译器就会忽略这个告警。常用如下:

void *p;
double *q = static_cast<double*> (p);//支持指针的强制转换
 
double Pi= 3.1415926;
int pi = static_cast<int> (Pi);//此处不会有warning

const_cast能够将变量的const属性去除。如一个函数的入参是 char*类型,当传入一个const char*时,编译会报错。这时可以使用const_cast去除它的const属性。

  #include <iostream>
  using namespace std;
  
  void print(char* s)
  {
      cout << s << endl;
  }
  int main()
  {
      const char* s = "abc";
      print(const_cast<char*> (s));//去除s的const属性
      return 0;
  }

 

dynamic_cast支持运行时识别指针或引用类型所指向的对象。

dynamic_cast使用时先去判断转换是否有效,有效才进行转换。

转换对象是指针时,若转换失败,则转换的结果是NULL指针;若转换对象是引用,若转换失败,则抛出一个bad_cast的异常。

 

reinterpret_cast通常是在位操作层次上进行的强制转换。转换后一定要记住原始类型,保证后续操作兼容原始类型,否则可能会造成一些奇怪的输出结果。

 int *ip;
 char *pc = reinterpret_cast<char*> (ip);
 //Coder一定要记住pc所指向的对象实际是int类型的。
 
 string s(pc);//这里s里面的内容很奇怪。

 

以上是关于隐式转换和显式转换的主要内容,如果未能解决你的问题,请参考以下文章

隐式转换和显式转换

隐式转换和显式转换及强制转换的区别

Oracle sql中的隐式和显式数据类型转换有啥区别

C语言 显式 隐式是啥意思

C#类型转换总结

C#类型转换总结