【问题标题】:Does it matter which operand of integer division is static_casted to obtain a float result?整数除法的哪个操作数是 static_casted 以获得浮点结果是否重要?
【发布时间】:2015-05-08 06:17:05
【问题描述】:

要从两个ints 的除法中获得浮点结果,我们将static_cast 操作数之一传递给float,如下所示:

int a = 2;
int b = 3;
float c = static_cast<float>(a) / b;  // c = 0.666666
float d = a / static_cast<float>(b);  // d = 0.666666

在上述情况下,哪个操作数是static_casted 并不重要。但是,假设其中一个操作数是编译时常量,而另一个不是,如下所示:

int a = foo();  // value not available at compile-time.
const int b = SOME_CONSTANT;  // compile-time constant.

编译器优化是否对两个static_casts 有任何影响,如下所述?

float c = static_cast<float>(a) / b;

在这种情况下,编译器可以将 b 替换为其值,但由于 a 未知,因此只能在运行时进行转换。

float d = a / static_cast<float>(b);

但是,在这种情况下,编译器知道b,因此它可以在编译时进行转换,并将b 直接替换为float 值。

在这两种情况下,在转换之后,整数/浮点数(或浮点数/整数)除法都会在运行时发生。

这种直觉是否正确,或者编译器是否足够聪明,可以在两种情况下同样优化?还有其他我忽略的因素吗?

【问题讨论】:

    标签: c++ casting compiler-optimization


    【解决方案1】:

    在运行时不会发生 int/floatfloat/int 分割。永远。

    由于一个操作数被强制转换 - 显式转换 - 为 float,因此另一个操作数将隐式转换为 float 以进行除法。

    你的两种情况都等价于

    static_cast<float>(a) / static_cast<float>(b);
    

    【讨论】:

    • 谢谢,我不知道这个!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2014-09-29
    相关资源
    最近更新 更多