如果我在C:中声明两个最大整数
int a = INT_MAX;
int b = INT_MAX;
并将它们相加为另一个int:
int c = a+b;
我知道有一个缓冲区溢出,但我不确定如何处理。
这会导致未定义的行为,因为您使用的是有符号整数(如果溢出,则会导致未确定的行为(。
您需要找到避免溢出的方法,或者如果可能,切换到无符号整数(使用包装溢出(。
一种可能的解决方案是切换到长整数,这样就不会发生溢出。另一种可能性是首先检查溢出:
if( (INT_MAX - a) > b) {
// Will overflow, do something else
}
注意:我假设您实际上并不知道a
和b
的确切值。
为了使计算有意义,您必须使用足够大的类型来保存结果。除此之外,溢出只是有符号int
的一个问题。如果使用无符号类型,则不会得到未定义的溢出,而是得到定义良好的环绕。
在这种特定情况下,解决方案是微不足道的:
unsigned int c = (unsigned int)a + (unsigned int)b; // 4.29 bil
否则,如果你真的想知道原始二进制值的有符号等价物,你可以这样做:
int c = (unsigned int)a + (unsigned int)b;
只要计算是在无符号类型上进行的,就没有危险(在这种情况下,值会合适——它不会换行(。加法的结果通过赋值到=
的左操作数的有符号类型来隐式转换。这种转换是由实现定义的,因为结果取决于所使用的签名格式。在2的补充主流计算机上,您很可能会得到值-2
。