在这种情况下溢出意味着什么?

时间:2014-11-27 16:25:25

标签: c++ pseudocode assertion

我找到了一个在modoulus中相乘的算法。下一个伪代码取自维基百科,页面模块化指数,部分从右到左的二进制方法。

完整的伪代码是

function modular_pow(base, exponent, modulus)
    Assert :: (modulus - 1) * (modulus - 1) does not overflow base
    result := 1
    base := base mod modulus
    while exponent > 0
        if (exponent mod 2 == 1):
           result := (result * base) mod modulus
        exponent := exponent >> 1
        base := (base * base) mod modulus
    return result

我不明白这行伪代码是什么意思Assert :: (modulus - 1) * (modulus - 1) does not overflow base;这一行意味着什么?如何用C ++编写最佳程序?

2 个答案:

答案 0 :(得分:1)

在大多数计算机编程语言中,数字只能以有限的精度或在一定范围内存储。

例如,C ++整数通常是32位有符号整数,最多可以存储2 ^ 31作为值。

如果您尝试将两个数字相乘并且结果将大于2 ^ 31,则无法得到您期望的结果,它已经溢出。

答案 1 :(得分:1)

Assert(粗略地说)是一种检查先决条件的方法; "必须这样才能继续"。在C ++中,您将使用assert macro或您自己的手动断言系统对其进行编码。

'不溢出'意味着该陈述不应该太大而不适合任何整数类型base;它是一个乘法,所以很有可能。 C ++中的整数溢出是未定义的行为,因此防范它是明智的!有很多资源可以解释整数溢出,例如this article on Wikipedia

要在C ++中进行检查,一个很简单的方法是将中间结果存储在一个更大的整数类型中,并检查它是否足够小以适应目标类型。例如,如果base int32_t使用int64_t,请检查它是否低于static_cast<int64_t>(std::numeric_limits<int32_t>::max())

const int64_t intermediate = (static_cast<int64_t>(modulus) - 1) * (static_cast<int64_t>(modulus) - 1);
assert(intermediate < static_cast<int64_t>(std::numeric_limits<int32_t>::max()));