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++ 中,开发人员可以通过使用构造函数和重载 ( cast) 运算符。

标准允许转换的完整规则以及不允许转换的完整规则可能非常复杂。我试图忠实地在这个答案中对其中一些规则进行简要的总结。如果您真的对允许和不允许的内容感兴趣,我强烈建议您访问标准并阅读有关类型转换的相应部分。

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

相关文章:

c++ - 将项目添加到列表和迭代器问题

c++ - 稀疏矩阵

c++ - 在 c++/c 中用变量定义数组的长度

c - C 中的函数指针和内存管理

c++ - 构造(但不破坏)具有已删除或非用户提供的私有(private)析构函数的类的对象

c++ - 从父模板类转换为子模板类

c - 如何同时处理来自 Stdin Stream 的两个输入,其中一个来自 C 中的数字键盘?

javascript - 有没有一种有效的方法可以从 JavaScript 中的数组中获取某种类型的所有值?

python - 检查相等列表

SQL Server 2005 数据类型