究竟什么是C/C++中的类型转换?

plu*_*uck 39 c c++ types casting

究竟什么是C/C++中的类型转换?编译器如何检查是否需要显式类型转换(并且是否有效)?它是否比较了值所需的空间?如果我有例如:

int a;
double b = 15.0;
a = (int) b;
Run Code Online (Sandbox Code Playgroud)

如果我没记错的话,double值需要更多的空间(是8字节?!)而不是整数(4字节).并且两者的内部表示完全不同(在两个/尾数上的补码).那么内部会发生什么?这里的例子非常简单,但在C/C++中有很多类型.

如果我可以将例如FOO转换为BAR,编译器如何知道(或程序员)?

Mic*_*eyn 32

类型转换基本上是从一种类型到另一种类型的转换.它可以是隐式的(即,由编译器自动完成,可能在过程中丢失信息)或显式(即,由代码中的开发人员指定).这些类型占据的空间是次要的.更重要的是转换的适用性(有时候是方便的).

隐式转换可能会丢失信息,可能丢失/获得符号,并且可能发生上溢/下溢.除非通过编译时生成的警告,否则编译器不会保护您免受这些事件的影响.当派生类型被隐式转换为基类型(按值)时,也可能发生切片.

对于可能非常危险的转换(例如,从基类到派生类型),C++标准需要显式转换.不仅如此,但它提供了更严格的显式转换,如static_cast,dynamic_cast,reinterpret_cast,和const_cast,其中每个进一步限制了显式的唯一可能转换的一个子集,减少了转换错误的可能性.

隐式和显式的有效转换最终由C/C++标准定义,尽管在C++中,开发人员能够通过使用构造函数和重载(转换)运算符来扩展用户定义类型(包括隐式和显式)的转换. .

标准允许使用强制转换的完整规则可能会非常复杂.我试图在这个答案中忠实地提出一些有关这些规则的简明摘要.如果您真正对什么是允许的和不允许的感兴趣,我强烈建议您访问标准并阅读有关类型转换的相应部分.


Ben*_*igt 9

只是想提一下经常被忽视的事情:

  • 强制转换总是创建目标类型的临时值(尽管如果目标类型是引用,您将不会注意到).

这很重要.例如:

#include <iostream>

void change_one_print_other( int& a, const int& b )
{
    a = 0;
    std::cout << b << "\n";
}

int main(void)
{
    int x = 5, y = 5;

    change_one_print_other(x, x);
    change_one_print_other(y, static_cast<int>(y));
}
Run Code Online (Sandbox Code Playgroud)

那个演员LOOKS没用.但看起来可能是骗人的.