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
}
注意:我假设您实际上并不知道 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
.
如果我在 C 中声明两个最大整数:
int a = INT_MAX;
int b = INT_MAX;
并将它们加到另一个整数中:
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
.