【问题标题】:How can I work around int overflow in c如何解决 c 中的 int 溢出问题
【发布时间】:2014-03-09 17:18:28
【问题描述】:

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

【问题讨论】:

  • 尝试改用long long
  • 如果你已经知道结果,为什么还要使用这样一个奇怪的公式?
  • 只需将10000 更改为10000LL 即可。这会将计算更改为使用具有更高精度的long long。结果将(在这种情况下)仍然适合常规 int
  • 谢谢约阿希姆。你在现场。
  • 谢谢约阿希姆。你很准。在回答您的问题 deviantfan 时,公式中的一个数字:735625 是我程序中的计算变量 g。在这里写出我的整个程序没有任何意义。你只需要一个变量的实例。

标签: c


【解决方案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;

现场观看:http://ideone.com/pA2Pvm

【讨论】:

【解决方案2】:
i = (int)((10000.0 * 735625.0 + 14780.0)/3652425.0);

printf("%d",i);

变态

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-12
    • 2021-03-05
    • 1970-01-01
    • 2011-11-12
    • 1970-01-01
    • 2019-07-02
    • 2015-12-25
    相关资源
    最近更新 更多