当前位置: 首页 > 知识库问答 >
问题:

如何检查A B是否超过long long?(A和B都是长的)[重复]

王高超
2023-03-14

我有两个数字:A和B。我需要在我的代码中的某个地方计算A B。A和B都是长的,可以是正的,也可以是负的。

我的代码运行错误,我怀疑问题发生在计算A B时。我只想检查A B是否超过了long long范围。因此,任何方法都是可以接受的,因为我只将其用于调试。

共有3个答案

邢寒
2023-03-14

此外,如果您仅将其用于调试,则可以使用以下“hack”直接读取上一个操作的溢出位(假设您的编译器/cpu支持此功能):

int flags;
_asm {
    pushf       // push flag register on the stack
    pop flags   // read the value from the stack
}
if (flags & 0x0800) // bit 11 - overflow
    ...
许胡非
2023-03-14

类似于以下内容:

long long max = std::numeric_limits<long long>::max();
long long min = std::numeric_limits<long long>::min();

if(A < 0 && B < 0) 
    return B < min - A;
if(A > 0 && B > 0)
    return B > max - A;

return false;

我们可以这样解释:

>

  • 如果AB是相反的符号,它们不能溢出-大于零的需要大于max或小于零的需要小于min

    在其他情况下,简单的代数就足够了。<代码>A B

  • 仰欣悦
    2023-03-14

    只有当两个数字具有相同的符号时才可能溢出。如果两者都是正的,那么如果数学上A B,则您有溢出

    if (A > 0) {
        return B > (LLONG_MAX - A);
    }
    if (A < 0) {
        return B < (LLONG_MIN - A);
    }
    return false;
    

    检测溢出。由于初始检查,这些计算不会溢出。

    检查A B结果的符号将适用于溢出整数计算的保证环绕语义学。但是有符号整数的溢出是未定义的行为,即使在以环绕为实现行为的CPU上,编译器也可能假设没有发生未定义的行为,并在实现时完全删除溢出检查。因此问题评论中建议的检查非常不可靠。

     类似资料:
    • 问题内容: 我想检查两个日期是否超过一周,例如,检查两个日期是否有7天, 此时,数据范围应仅在一周之内(7天)。 我已经尝试过这样的事情, 有人可以帮忙吗? 问题答案: 最简单的方法是使用Jodatime并使用 另一个解决方案是使用日历,添加7天,然后再次进行比较。

    • 我创建了一个事件。现在我想检查它们是否重叠。我在数据库中以日期格式存储了开始时间和结束时间。 现在我想检查事件的时间是否重叠。为此,我想获取所有事件start Time和endTime,从日期检索小时和分钟,然后将小时和分钟与当前小时和分钟进行比较。 日期格式如下:df=新的SimpleDateFormat(“E-MMM-dd-HH:mm:ss-zz-yyyy”); 我第一次尝试通过查询比较两个日

    • 问题内容: 有没有办法找出一个类是否已重写和? 问题答案: 您可以使用反射 如果将注释掉,如果没有注释,将打印。 将返回实现该对象的类的对象。 请注意 ,仅适用于方法。但是,在这种情况下,和必须。取决于其他算法,该算法将需要更改。

    • 问题内容: 我想检查linux bash文件是否已创建超过x次。 假设文件名为text.txt,时间为2个小时。 问题答案: 仅用于修改时间 或者,同一行: 您可以使用更改或访问时间。正如其他人指出的那样,我认为您无法跟踪创建时间。

    • 问题内容: 我在pandas DataFrame中有两列:和。我想创建第三列:单元格的值是相应行的中是否包含相应行的,否则。 因此结果将如下图所示。 我已经试过,,,,等,但Python中返回一个错误:“系列”的对象是可变的,因此它们不能被散列。有谁知道如何在Python中创建第三列? 问题答案: IIUC,然后您可以逐行进行lambda来检查在Authors中是否存在Name字符串: 应该管用

    • 我下面有这些代码,如何检查是否为空? 如果我将,它显示此[] 如何检查数组是否为空,然后显示消息“This is empty”? 我试过了,但效果不好。即使它大于或小于0,也将始终显示“2”