gpt4 book ai didi

c++ - 如何检测无符号整数溢出?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:16 29 4
gpt4 key购买 nike

我正在用 C++ 编写一个程序来查找 ab = c 的所有解,其中 < em>a、bc 一起使用所有数字 0-9 恰好一次。该程序循环遍历 ab 的值,并且每次在 ab ab 检查是否满足数字条件。

但是,当 ab 溢出整数限制时,可能会生成伪解。我最终使用如下代码检查了这一点:

unsigned long b, c, c_test;
...
c_test=c*b; // Possible overflow
if (c_test/b != c) {/* There has been an overflow*/}
else c=c_test; // No overflow

是否有更好的溢出测试方法?我知道有些芯片有一个内部标志,会在发生溢出时设置,但我从未见过通过 C 或 C++ 访问它。


注意签名 int溢出在 C 和 C++ 中是未定义的行为,因此您必须检测它而不实际导致它。对于加法前的有符号整数溢出,请参见 Detecting signed overflow in C/C++ .

最佳答案

我看到您正在使用无符号整数。根据定义,在 C 中(我不知道 C++),无符号算术不会溢出……所以,至少对于 C,您的观点是没有实际意义的 :)

对于有符号整数,一旦发生溢出,undefined behaviour (UB) 已经发生,您的程序可以做任何事情(例如:呈现测试不确定)。

#include <limits.h>

int a = <something>;
int x = <something>;
a += x; /* UB */
if (a < 0) { /* Unreliable test */
/* ... */
}

要创建符合要求的程序,您需要在生成所述溢出之前测试溢出。该方法也可用于无符号整数:

// For addition
#include <limits.h>

int a = <something>;
int x = <something>;
if (x > 0 && a > INT_MAX - x) // `a + x` would overflow
if (x < 0 && a < INT_MIN - x) // `a + x` would underflow

// For subtraction
#include <limits.h>
int a = <something>;
int x = <something>;
if (x < 0 && a > INT_MAX + x) // `a - x` would overflow
if (x > 0 && a < INT_MIN + x) // `a - x` would underflow

// For multiplication
#include <limits.h>

int a = <something>;
int x = <something>;
// There may be a need to check for -1 for two's complement machines.
// If one number is -1 and another is INT_MIN, multiplying them we get abs(INT_MIN) which is 1 higher than INT_MAX
if (a == -1 && x == INT_MIN) // `a * x` can overflow
if (x == -1 && a == INT_MIN) // `a * x` (or `a / x`) can overflow
// general case
if (x != 0 && a > INT_MAX / x) // `a * x` would overflow
if (x != 0 && a < INT_MIN / x) // `a * x` would underflow

对于除法(INT_MIN-1 特殊情况除外),不可能超过 INT_MININT_MAX

关于c++ - 如何检测无符号整数溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6370166/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com