关于编译器对除法的优化
  • 板块学术版
  • 楼主_Kagamine_Rin_
  • 当前回复10
  • 已保存回复12
  • 发布时间2025/7/24 16:09
  • 上次更新2025/7/24 19:51:54
查看原帖
关于编译器对除法的优化
260985
_Kagamine_Rin_楼主2025/7/24 16:09
#include <stdio.h>
int main() {
    unsigned long long x;
    scanf("%llu", &x);
    x = x / 7;
    printf("%llu", x);
}

对于以上代码,我们也可以用以下程序实现。

#include <stdio.h>
int main() {
    unsigned long long x;
    scanf("%llu", &x);
    x = x * (__uint128_t)(2635249153387078803) >> 64;
    printf("%llu", x);
}

但这两段代码的输出汇编结果不同:https://godbolt.org/z/e66jc9181。

可以发现优化除以 7 需要使用 2635249153387078803 进行乘法运算是正确的,但是为什么前者的汇编多了几行。我怀疑这是因为后者会出现误差,但实际测试时并未发现反例。

如果后者是正确的:

  • 为什么编译器不使用右侧的写法?
  • 哪一种写法的运行速度更快?

如果后者是错误的:

  • 举出反例(最好写出出现误差的原因)
  • 前者为什么不会出现误差
2025/7/24 16:09
加载中...