C/C++ 中的类型转换到底是什么?编译器如何检查是否需要(并且有效)显式类型转换?它是否比较一个值所需的空间?例如,如果我有:
int a;
double b = 15.0;
a = (int) b;
如果我没记错的话, double 值比整数(4 字节)需要更多空间(是 8 字节吗?!)。并且两者的内部表示是完全不同的(补二/尾数)。那么内部会发生什么呢?这里的例子很简单,但是在 C/C++ 中有很多类型转换。
编译器如何知道(或程序员)我是否可以转换,例如FOO 到 BAR?
最佳答案
类型转换基本上是从一种类型到另一种类型的转换。它可以是隐式的(即由编译器自动完成,可能会在过程中丢失信息)或显式的(即由开发人员在代码中指定)。类型占据的空间是次要的。更重要的是转换的适用性(有时是方便性)。
隐式转换可能会丢失信息,可能会丢失/获得符号,并且可能会发生上溢/下溢。编译器不会保护您免受这些事件的影响,除非可能通过在编译时生成的警告。当派生类型隐式转换为基类型(按值)时,也会发生切片。
对于可能非常危险的转换(例如,从基类型到派生类型),C++ 标准需要显式转换。不仅如此,它还提供了更多限制性的显式转换,例如 static_cast
、dynamic_cast
、reinterpret_cast
和 const_cast
,每个都进一步将显式转换限制为仅可能转换的子集,从而减少了转换错误的可能性。
隐式和显式的有效转换最终由 C/C++ 标准定义,尽管在 C++ 中,开发人员可以通过使用构造函数和重载 ( cast) 运算符。
标准允许转换的完整规则以及不允许转换的完整规则可能非常复杂。我试图忠实地在这个答案中对其中一些规则进行简要的总结。如果您真的对允许和不允许的内容感兴趣,我强烈建议您访问标准并阅读有关类型转换的相应部分。
关于c++ - C/C++ 中的类型转换到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7558837/