0

我正在查看一些遗留代码,它试图将 along double转换为float. 从阅读http://www.cplusplus.com/forum/beginner/34088/看来,long doubleasizeof()为 16,而浮点数sizeof()为 8。

当在转换后引用浮点变量时,您会得到一个floating point overflow exception预期的...

在调试模式下运行时,IDE 每次都会向您显示异常,除非您忽略所有该类型。我不希望这样做,因为我希望妥善解决问题。

因此,这将问题归结为:

有没有办法进行这样的演员表,而不会溢出(或替代演员表可以让我得到相同的信息)?

当前的铸造看起来像:floatVar = (float) longDoubleVar;

4

2 回答 2

3

将类型值转换为类型long doublefloat是定义明确且有意义的。如果结果太大而无法存储在 a 中float,则结果为浮点异常,默认情况下无效;存储的值是+inf-inf

浮点异常不是 C++ 异常;它特定于浮点,并且在您的代码运行时不会被看到,除非您已经竭尽全力安装浮点陷阱处理程序。也许您的 IDE 安装了陷阱处理程序;如果是这样,您必须查阅文档以了解如何禁用此“功能”。

于 2013-10-11T13:50:00.497 回答
0

除非您知道 long double 的内容可以容纳在 float 中而不会截断数据,否则 float 将永远无法保存 long double 的内容。

通常编译器会发出警告,警告可能的数据丢失。C++ 提供了多种形式的转换,但不幸的是,从较大的数据类型转换为较小的数据类型总是存在溢出的风险。我假设如果你在这里有 long double 变量的内容大于浮点数可以容纳的内容。

不会发生溢出的唯一方法是从较小的数据类型变为较大的数据类型。例外是较大的内容是否适合较小类型的边界(在某些情况下仍会引发警告)

于 2013-10-11T14:11:01.747 回答