#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 进行乘法运算是正确的,但是为什么前者的汇编多了几行。我怀疑这是因为后者会出现误差,但实际测试时并未发现反例。
如果后者是正确的:
- 为什么编译器不使用右侧的写法?
- 哪一种写法的运行速度更快?
如果后者是错误的:
- 举出反例(最好写出出现误差的原因)
- 前者为什么不会出现误差