我正在查看一些遗留代码,它会尝试将long double
转换为float
。从阅读http://www.cplusplus.com/forum/beginner/34088/看,long double
的{{1}}为16,其中浮点数为sizeof()
为8。
当在演员表之后引用浮点变量时,你得到一个sizeof()
,这是预期的......
在调试模式下运行时,IDE会每次显示异常,除非您忽略所有类型。我不希望这样做,因为我希望妥善解决问题。
所以这将问题归结为:
有没有办法进行这样的演员表,而不会出现溢出(或替代演员会得到相同的信息)?
当前的投射看起来像是:floating point overflow exception
答案 0 :(得分:3)
将类型long double
的值转换为类型float
的值是明确定义且有意义的。如果结果太大而无法存储在float
中,则结果是浮点异常,默认情况下无效;存储的值为+inf
或-inf
。
浮点异常不是C ++异常;它特定于浮点数,并且在代码运行时不会被看到,除非您已经不再使用安装浮点陷阱处理程序的方法。也许您的IDE会安装陷阱处理程序;如果是这样,您将不得不查阅文档以了解如何禁用此“功能”。
答案 1 :(得分:0)
float永远不能保存long double的内容,除非你知道long double的内容可以放在float中而不截断数据。
通常,编译器会发出警告,警告可能的数据丢失。 C ++提供了许多形式的转换,但不幸的是,从较大的数据类型到较小的数据类型将始终存在溢出的风险。我假设你在这里的长双变量内容大于浮点数可以容纳的。
如果您从较小的数据类型转到较大的数据类型,则不会发生溢出的唯一方法。例外情况是较大类型的内容将适合较小类型的边界(在某些情况下仍会发出警告)