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