C语言 Sum of INT_MAX and INT_MAX



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

int a = INT_MAX;
int b = INT_MAX;

并将它们相加为另一个int:

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

最新更新