C中有意签名溢出的示例

时间:2013-07-03 13:31:37

标签: c signed

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

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

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

2 个答案:

答案 0 :(得分:3)

我们使用整数溢出在32位CPU上实现64位算术(在C和C ++中,早在20世纪80年代)。在我的脑海中,我认为它的编码是这样的:

// 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
}

现在,授予,这不是使用 signed 整数溢出,但我认为我们确实已经签署了这些例程的整数形式,基于检测溢出的相同原理来调整最后结果。 (我现在无法回想起细节。)我记得,大多数例程实际上都被编码为C预处理器宏。

答案 1 :(得分:1)

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

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

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