【发布时间】:2020-07-07 15:33:25
【问题描述】:
我需要在 uint64_t 上乘以 uint64_t 时完成溢出量。这可以通过下面的公式计算,但我无法访问 128 位整数。
使用uint128_t的示例伪代码:
uint64_t x = ...
uint64_t y = ...
uint128_t result = (uint128_t)x * (uint128_t)y / ((uint128_t)1 << 64);
也可以通过将uint128_t 拆分为[uint64_t, uint64_t] 并执行示例中的计算来实现。我考虑不使用它,因为我担心它很慢。
【问题讨论】:
-
您要计算
result还是“完成的溢出量”? -
什么是“溢出量”?实际结果(没有溢出/至少 128 位)和溢出结果之间的差异?但哪个溢出? C 没有指定溢出的效果
-
BTW
(UINT64_MAX + 1)可以为 0,因为uint64_t上的溢出,很可能UINT64_MAX被定义为uint64_t,不好除以 0 ... -
我更新了代码,使其更像 C。我从未使用过
uint128_t,但我认为这段代码现在大部分可以由拥有它的编译器运行。 -
我看到 anatolyg 打败了我。