我知道C中的有符号溢出是根据标准的未定义行为,但实际上对于有符号整数使用2的补码是很常见的(甚至允许,例如使用gcc中的-fwrapv
选项) ,我想找到一个充分利用这一事实的程序示例列表。
诸如“递增偶尔溢出的计数器”之类的程序似乎更适合无符号整数,所以我认为它们不算数。
此外,我不考虑在这种情况下可以启用的编译器优化,但实际使用有符号溢出来计算有趣内容的有用程序。
答案 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帐户)讨论后,他将我指向了这个网站:
我接受了@David R Tribble的答案,因为它是签名溢出的“真实世界”示例,但我也将此处的链接作为参考。