gpt4 book ai didi

c++ - 用于 C++ 类型转换的 Visual Studio 编译器优化

转载 作者:可可西里 更新时间:2023-11-01 17:59:14 25 4
gpt4 key购买 nike

我在代码中有以下语句:

int a = (int)( (float)(b * 1000) / (float)c + .5f );

其中 b 也是一个 intc 是一个 unsigned int,具有常量值(在我的测试运行中为 15)

此语句位于 while 循环内,其中 b 在每次迭代时递增 1。

这段代码运行良好,直到我决定在 Visual Studio 中打开优化标志(最大速度)。之后,a 会随机发生溢出(即它的值为 -2147483647)。在进一步调查时,这种溢出过去常常发生在 b 的不同值上。在我观察到的测试运行中,发生溢出的 b 值在 9-12 之间。

解决问题的方法是进行如下所示的小改动:

int a = (int)( (b * 1000.f) / c + .5f );

关于这有何帮助的任何想法?它工作正常,但我不明白为什么?

编辑:根据评论添加更多信息:

在记录时,我观察到:

( float )(b * 1000)/( float )c + .5f

被评估为一个非常大的值,当类型转换为 int 时会导致溢出。然而,单独地,float(b*1000)float(c) 计算正确。

最佳答案

b * 1000 最有可能溢出 int 类型;这样做的行为是未定义

丢掉所有那些令人困惑的转换,然后使用

b * 1000.0/c + 0.5

相反。 1000.0 是一个 double 字面量,导致第一项以 float 计算。

在转换回 int 之前,您应该检查表达式的大小,尤其是当 c 很小的时候。 std::numeric_limits 对此很有用。

关于c++ - 用于 C++ 类型转换的 Visual Studio 编译器优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35696202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com