【发布时间】:2025-12-25 21:55:05
【问题描述】:
我有两个号码:A 和 B。我需要在代码中的某处计算A+B。 A 和B 都是long long,它们可以是正面的或负面的。
我的代码运行错误,我怀疑在计算A+B 时会出现问题。我只是想检查A+B 是否超过long long 范围。所以,任何方法都是可以接受的,因为我只用它来调试。
【问题讨论】:
-
if ((A<0 && B<0 && A+B>0) || (A>0 && B>0 && A+B<0)){/*Overflow*/}只有当 A 和 B 的符号相同时,才会溢出。如果他们这样做了,并且 A+B 没有相同的符号,那么你就有溢出问题。在其他新闻中,这基本上是最快的方法,因为它在恒定时间内执行,并且只执行一次加法。 -
您应该将其发布为答案。顺便说一句,当
A=B=0x8000000000000000,然后A+B=0并且您的代码不起作用时,有一个极端情况:p -
@FrankieTheKneeMan 整数溢出是未定义的行为。
-
@John 这就是我将其作为评论提交的原因。我的答案适用于大多数编译器,对于第一步调试来说已经足够了。
-
@AlexeyFrunze 你提到的所谓的副本处理无符号类型,在所有情况下都以明确定义的方式表现。在某些情况下,Sigend 整数的行为并不明确。