我怎样才能解决c中的int溢出问题

时间:2014-03-09 17:18:28

标签: c

在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;
}

2 个答案:

答案 0 :(得分:1)

根据usual arithmetic conversions,当10000 * 735625 + 14780int的范围之外)试图保存到int时,它会溢出。

  

对操作数执行整数提升,如下所示:

     
      
  • 如果任一操作数的类型为unsigned long,则另一个操作数将转换为unsigned long类型。
  •   
  • 如果未满足先前条件,并且任一操作数的类型为long而另一个类型为unsigned int,则两个操作数都将转换为unsigned long类型。
  •   
  • 如果不满足前两个条件,并且任一操作数的类型为long,则另一个操作数将转换为long类型。
  •   
  • 如果不满足前面三个条件,并且任一操作数的类型为unsigned int,则另一个操作数将转换为unsigned int类型。
  •   
  • 如果不满足上述条件,则两个操作数都将转换为int类型。
  •   

要解决这个问题,你需要使用long long(范围更大)。

正如@JoachimIsaksson所建议的那样,一种简单的方法是在LL10000long long的精度计算:

i = ( 10000LL * 735625 + 14780)/3652425;

现场直播:http://ideone.com/pA2Pvm

答案 1 :(得分:0)

i = (int)((10000.0 * 735625.0 + 14780.0)/3652425.0);

printf("%d",i);

瓦尔特