如何检查是否发生了溢出?

11 浏览
0 Comments

如何检查是否发生了溢出?

这个问题已经有了答案:

可能的重复问题:

C/C++中检测整数溢出的最佳方法

这可能是一个初学者的问题,但是我怎样才能在C中检查数字的溢出是否影响了它的值。例如,当乘法的操作数都是整数,且期望得到的结果也是整数时,如果实际的结果比最大整数值还要大,那么实际的结果会被修改,对吗?那么我该如何判断是否发生了这种情况?

admin 更改状态以发布 2023年5月21日
0
0 Comments

C99标准有一节解释了什么是未定义的行为:
\n3.4.3
\n未定义行为
\n当使用非可移植或错误的程序结构或错误的数据时,行为是没有被这个国际标准规定的。
\n可能的未定义行为范围从完全忽略情况到具有环境特征的文档化翻译或程序执行行为(带或不带诊断消息),直到终止程序的翻译或执行(带诊断消息)。
\n例子
\n未定义行为的一个例子是整数溢出时的行为
\n因此,在一般情况下,事后没有一种可移植的检测方法。
\n您的编译器/实现可能支持一些扩展/支持它,而且有一些技术可以避免这些情况。
\n参见这个问题,获得优秀的建议:在C / C ++中检测整数溢出的最佳方法

0
0 Comments

有符号整数溢出跟除零一样,会导致未定义的行为,因此在执行可能会溢出的操作之前必须检查是否会发生溢出。一旦发生了溢出,输出结果就不可预测 - 你的代码可能会做任何事情。

中定义的*_MAX_MIN宏可用于解决这个问题,但您需要小心不要在测试本身中发生未定义的行为。例如,要检查在给定int a,b;的情况下a * b是否会溢出,可以使用:

if ((b > 0 && a <= INT_MAX / b && a >= INT_MIN / b) ||
    (b == 0) ||
    (b == -1 && a >= -INT_MAX) ||
    (b < -1 && a >= INT_MAX / b && a <= INT_MIN / b))
{
    result = a * b;
}
else
{
    /* calculation would overflow */
}

(请注意,这避免了一个微妙的陷阱,即您无法计算INT_MIN / -1 - 这样的数字不能保证是可表示的,并且实际上会在常见平台上导致致命陷阱)。

0