c++ - C/C++ 中的类型转换到底是什么?

标签 c++ c types casting

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

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

如果我没记错的话, double 值需要比整数(4 字节)更多的空间(是 8 字节吗?!)。并且两者的内部表示完全不同(补二/尾数)。那么内部发生了什么?这里的示例非常简单,但在 C/C++ 中存在大量类型转换。

编译器(或程序员)如何知道我是否可以进行转换,例如FOO 到 BAR?

最佳答案

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

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

对于可能非常危险的转换(例如,从基类型到派生类型),C++ 标准需要显式强制转换。不仅如此,它还提供了更具限制性的显式强制转换,例如 static_castdynamic_castreinterpret_castconst_cast ,其中每一个都进一步将显式转换限制为仅可能转换的子集,从而减少了转换错误的可能性。

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

标准允许哪些类型转换以及不允许哪些类型转换的完整规则可能会变得相当复杂。我试图在这个答案中忠实地介绍其中一些规则的简洁摘要。如果您确实对允许和不允许的内容感兴趣,我强烈建议您访问标准并阅读有关类型转换的相应部分。

关于c++ - C/C++ 中的类型转换到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20140204/

相关文章:

c++ - 是否值得对齐变量?

c - 退格进入 C char*

C 指针参数与本地副本

scala - 编译时检查某些属性

c++ - MAP 文件分析——我的代码大小从何而来?

c++ - 如何在我的程序中创建日志系统?

c - 允许与 Throw The Switch 的 Unity 单元测试框架进行双浮点比较

c++ - Qt/SQL - 从没有记录的表中获取列类型和名称

sql - 让 PostgreSQL 更容错一点?

c++ - C++ STD::List:遍历列表的麻烦