<分区>
接近 C、C++ 和 D 等金属语言,什么是最有效且合理可移植的方式(即不使用汇编程序,尽管您可以假设二进制补码算法和环绕行为)来检测无符号溢出64 位整数乘法?
<分区>
接近 C、C++ 和 D 等金属语言,什么是最有效且合理可移植的方式(即不使用汇编程序,尽管您可以假设二进制补码算法和环绕行为)来检测无符号溢出64 位整数乘法?
最佳答案
可以通过将无符号类型可表示的最大值除以被乘数之一来提前检测溢出;如果结果小于另一个被乘数,则将它们相乘将导致超出无符号类型范围的值。
例如,在 C++ 中(使用 C++0x 精确宽度数字类型):
std::uint64_t left = 12;
std::uint64_t right = 42;
if (left != 0 && (std::numeric_limits<std::uint64_t>::max() / left) < right)
{
// multiplication would exceed range of unsigned
}
在 C 中,您可以使用 uint64_t
作为类型,使用 UINT64_MAX
作为最大值。或者,如果您只关心类型至少 64 位宽而不一定是正好 64 位宽,您可以使用unsigned long long
和 ULLONG_MAX
。
关于c++ - 最有效的可移植溢出检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3224621/