在C中,是否可以在不引起整数溢出的情况下进行以下操作? 我的答案需要是一个整数,我稍后会在程序中使用它。代码打印-337。 正确的答案应该是2014年。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main() {
int i;
i = (10000 * 735625 + 14780)/3652425;
printf("%d",i);
return 0;
}
答案 0 :(得分:1)
根据usual arithmetic conversions,当10000 * 735625 + 14780
(int
的范围之外)试图保存到int
时,它会溢出。
对操作数执行整数提升,如下所示:
- 如果任一操作数的类型为
unsigned long
,则另一个操作数将转换为unsigned long
类型。- 如果未满足先前条件,并且任一操作数的类型为
long
而另一个类型为unsigned int
,则两个操作数都将转换为unsigned long
类型。- 如果不满足前两个条件,并且任一操作数的类型为
long
,则另一个操作数将转换为long
类型。- 如果不满足前面三个条件,并且任一操作数的类型为
unsigned int
,则另一个操作数将转换为unsigned int
类型。- 如果不满足上述条件,则两个操作数都将转换为
int
类型。
要解决这个问题,你需要使用long long
(范围更大)。
正如@JoachimIsaksson所建议的那样,一种简单的方法是在LL
后10000
以long long
的精度计算:
i = ( 10000LL * 735625 + 14780)/3652425;
答案 1 :(得分:0)
i = (int)((10000.0 * 735625.0 + 14780.0)/3652425.0);
printf("%d",i);
瓦尔特