C ++ Builder 2009 Float vs Long Double

时间:2013-10-11 13:30:31

标签: c++ casting c++builder long-double

我正在查看一些遗留代码,它会尝试将long double转换为float。从阅读http://www.cplusplus.com/forum/beginner/34088/看,long double的{​​{1}}为16,其中浮点数为sizeof()为8。

当在演员表之后引用浮点变量时,你得到一个sizeof(),这是预期的......

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

所以这将问题归结为:

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

当前的投射看起来像是:floating point overflow exception

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

float永远不能保存long double的内容,除非你知道long double的内容可以放在float中而不截断数据。

通常,编译器会发出警告,警告可能的数据丢失。 C ++提供了许多形式的转换,但不幸的是,从较大的数据类型到较小的数据类型将始终存在溢出的风险。我假设你在这里的长双变量内容大于浮点数可以容纳的。

如果您从较小的数据类型转到较大的数据类型,则不会发生溢出的唯一方法。例外情况是较大类型的内容将适合较小类型的边界(在某些情况下仍会发出警告)