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

时间:2011-09-26 17:28:40

标签: c++ c types casting

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

int a;
double b = 15.0;
a = (int) b;

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

编译器如何知道(或程序员)我是否可以FOO到BAR?

4 个答案:

答案 0 :(得分:31)

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

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

对于可能完全危险的转换(例如,从基类到派生类型),C ++标准需要显式转换。不仅如此,它还提供了更严格的显式强制转换,例如static_castdynamic_castreinterpret_castconst_cast,每个强制转换都将显式强制转换为仅限于可能转换的子集,减少了投射错误的可能性。

隐式和显式的有效转换最终都是由C / C ++标准定义的,尽管在C ++中,开发人员可以通过使用构造函数和重载来扩展用户定义类型(包括隐式和显式)的转换(演员)运营商。

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

答案 1 :(得分: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));
}

那个演员LOOKS没用。但是looks can be deceiving

答案 2 :(得分:1)

有一些类型转换,编译器知道如何隐式执行 - double to int是其中之一。它只是丢弃小数部分。内部表示将作为过程的一部分进行转换,以便分配正常工作。

请注意,有些值太大,无法正确转换。我不记得那个案子的规则是什么;它可能由编译器自行决定。

答案 3 :(得分:1)

为您的代码制作一个小程序,并按照 How to get GCC to generate assembly code 中的说明查看编译器如何进行类型转换。