4

根据标准,我知道 C 中的有符号溢出是未定义的行为,但是由于在实践中,对有符号整数使用 2 的补码是很常见的(甚至允许,例如使用-fwrapvgcc 中的选项),我想找到一个充分利用这一事实的程序示例列表。

诸如“偶尔溢出的递增计数器”之类的程序似乎更适合无符号整数,所以我认为它们不算数。

此外,我不考虑在这种情况下可以启用的编译器优化,而是实际使用有符号溢出来计算有趣的有用程序

4

2 回答 2

3

我们使用整数溢出在 32 位 CPU 上实现 64 位算术(在 C 和 C++ 中,早在 1980 年代)。在我的脑海中,我认为它的编码如下:

// Add two-word integers
void add64(unsigned a[2], unsigned b[2])
{
    unsigned    t;

    // Add two-word integer b to a
    t = a[1];
    a[1] += b[1];    // Lower word
    if (a[1] < t)    // True if a[1]+b[1] overflows
        a[0]++;      // Upper word
}

现在,当然,这不是使用有符号整数溢出,但我认为我们实际上也有这些例程的有符号整数形式,基于检测溢出以调整最终结果的相同原理。(我现在不记得细节了。)我记得,大多数例程实际上都被编码为 C 预处理器宏。

于 2013-07-03T23:15:17.670 回答
1

在与工作中的一位同事(没有 StackOverflow 帐户)讨论后,他将我指向了这个网站:

http://www.gnu.org/software/autoconf/manual/autoconf-2.67/html_node/Signed-Overflow-Examples.html#Signed-Overflow-Examples

我接受了@David R Tribble 的回答,因为它是签名溢出的“真实世界”示例,但我也将链接留在这里作为参考。

于 2013-07-11T07:28:54.283 回答