与 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
为最大值。或者,如果您只关心类型是at least64位宽不一定exactly64位宽,你可以使用unsigned long long
and ULLONG_MAX
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)