INT_MAX 和 INT_MAX 的总和

Sum of INT_MAX and INT_MAX

如果我在 C 中声明两个最大整数:

int a = INT_MAX;
int b = INT_MAX;

并将它们加到另一个整数中:

int c = a+b;

我知道有缓冲区溢出,但我不知道如何处理。

这会导致未定义的行为,因为您使用的是有符号整数(如果它们溢出会导致未定义的行为)。

您将需要找到避免溢出的方法,或者如果可能,切换到无符号整数(使用环绕溢出)。

一个可能的解决方案是切换到长整数,这样就不会发生溢出。 另一种可能性是首先检查溢出:

if( (INT_MAX - a) > b) {
    // Will overflow, do something else
}

注意:我假设您实际上并不知道 ab 的确切值。

要使计算有意义,您必须使用足够大的类型来保存结果。除此之外,溢出只是有符号 int 的问题。如果你使用无符号类型,那么你不会得到未定义的溢出,而是明确定义的环绕。

在这种特定情况下,解决方案很简单:

unsigned int c = (unsigned int)a + (unsigned int)b; // 4.29 bil

否则,如果您真的想知道原始二进制值的带符号等价物,您可以这样做:

int c = (unsigned int)a + (unsigned int)b; 

只要计算是在无符号类型上进行的,就没有危险(并且该值适合这种情况 - 它不会环绕)。加法的结果通过赋值隐式转换为 = 左操作数的带符号类型。此转换是实现定义的,因为结果取决于所使用的签名格式。在 2 的补码主流计算机上,您很可能会得到值 -2.