【发布时间】:2016-02-29 09:41:11
【问题描述】:
我在代码中有以下语句:
int a = (int)( (float)(b * 1000) / (float)c + .5f );
其中b 也是int,
而c 是一个unsigned int,具有一个恒定值(在我的测试运行中为 15)
该语句在一个 while 循环中,其中 b 在每次迭代中递增 1。
在我决定在 Visual Studio 中打开优化标志(最大化速度)之前,这段代码运行良好。之后,a 会随机发生溢出(即它的值为-2147483647)。在进一步调查时,这种溢出过去常常发生在 b 的不同值上。在我观察到的测试运行中,发生溢出的 b 值在 9-12 之间。
解决问题的方法是进行如下所示的小改动:
int a = (int)( (b * 1000.f) / c + .5f );
您对这有什么帮助有任何想法吗?它工作正常,但我不知道为什么?
编辑:根据 cmets 添加更多信息:
在记录时,我观察到:
(float)(b * 1000) / (float)c + .5f
被评估为一个非常大的 value ,当类型转换为 int 时导致溢出。但是,float(b*1000) 和 float(c) 分别计算正确。
【问题讨论】:
-
b和c的类型有哪些?
-
@mustafagonul "其中
b也是int,c是unsigned int" -
您使用的优化标志很重要。该行为完全由实现定义。很明显,你犯了一个溢出错误。但我不知道,当您关闭优化标志时,它会以正确的方式运行。
-
有没有可能,
a并没有真正溢出启用优化,只是调试器无法报告其真实值?除了调试器报告的值之外,您是否看到任何实际可验证的a不正确的证据? -
我正在使用 /O2 优化标志(最大化速度)
标签: c++ visual-studio compiler-optimization