超过64位时未定义的行为

问题描述:

在我当前的32位应用程序中,我通过对64位整数执行操作来检查(偶尔会)溢出。超过64位时未定义的行为

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

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

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

大部分在这一问题的讨论适用:

How to detect integer overflow?

许多用于32位溢出chacking适用于64比特,以及(不是所有的技术的技术中讨论使用的下一个较大的整数类型来处理溢出)。

this document详细讨论捕捉溢出(c)。我不知道在C++中是否有更好的方法。

+0

在C++中,我会使用模板而不是该文档中的宏。消除对typeof()的需求。 – Justsalt 2008-10-15 15:38:26

一种解决方案是围绕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; 
} 

用于任何其它运算类似,尽管对于诸如权力,阶乘等非基本功能,这可能会变得非常复杂。

但是,如果你从基本的算术积木构建,他们会工作。