超过64位时未定义的行为

时间:2008-10-15 12:59:20

标签: c++ 64-bit

在我当前的32位应用程序中,我通过对64位整数进行操作来检查(非常偶尔)溢出。

但是,在64位系统上似乎没有标准的128位整数。是否有一种检查溢出的简单方法,或者获得128位整数的方法,它适用于所有操作系统和编译器?

我尝试使用GMP作为更通用的解决方案,但它对我的要求来说有点重量级。

效率不是太重要,没有特定于处理器的ASM。

3 个答案:

答案 0 :(得分:3)

这个问题的大部分讨论都适用:

How to detect integer overflow?

用于32位溢出chacking的许多技术也适用于64位(并非所有讨论的技术都使用下一个更大的整数类型来处理溢出)。

答案 1 :(得分:2)

this document详细讨论了捕获溢出(在c中)。我不知道在C ++中是否有更好的方法可以做到这一点。

答案 2 :(得分:1)

一种解决方案是在64位int周围创建一个类,它会在执行操作之前覆盖要检查的算术运算符。

我不记得我的头脑中的operatorX语法(很久以前我从C ++切换到Java)但是样本会是:

int64 myint64::add (int64 a, int64 b) {
    if (MAX_INT64 - a > b) {
        // error condition here.
    }
    return a + b;
}
int64 myint64::mul (int64 a, int64 b) {
    if (MAX_INT64 / a > b) {
        // error condition here.
    }
    return a * b;
}

类似于任何其他算术运算,尽管对于非基本函数,例如幂,阶乘等,这可能变得非常复杂。

但是,如果你从基本的算术构建块构建它们,它们就可以工作。