c++ - 最有效的可移植溢出检测?

标签 c++ c integer overflow d

<分区>

接近 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 longULLONG_MAX

关于c++ - 最有效的可移植溢出检测?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3224621/

相关文章:

c++ - 使用重载的 >> 运算符调用 CPP 构造函数

c++ - 计算循环中的数字总和

python - 如何从 Python 中的元组中的每个值中减一?

c - 从c中的命令行读取数字

c++ - 具有强大内存模型的平台上的 volatile 和多线程

c++ - g++ 标准支持

c++ - CEF 3 离屏渲染和页面源码

c - C函数指针问题中的最少帐单程序

c - 在 C 中使用内联汇编的错误

我可以比较 float 并将其与 C 中的整数相加吗?