使用long int避免溢出是一种很好的做法吗?

假设我已经声明了以下变量:

some_dataType a,b,c;  //a,b,c are positive
int res;
res=a+b-c;

我已经提供了变量res不能超过整数限制的信息。 只是为了避免溢出从表达式a+ba+bc我具有以下选项-

  • 将int,b,c声明为long int
  • (ac) + b
  • (long int) (a + bc)//或其他类型的投射
  • 我的问题是以上哪一点是好的做法。 另外,为了逃避这一切,我更喜欢做选项1.但是它可能会增加程序的内存大小(不是为了这个程序,而是为了大型应用程序)。
    假设:long int大于int谢谢@Retired Ninja


    没有简单的,通用的便携式方法来避免整数溢出。

    使用更宽的整数类型不是一个通用的解决方案,因为不能保证有更宽的整数类型。 在一些系统中intlong类型的大小相同是很常见的。 32位系统通常都是intlong 32位; 即使是一些64位系统也能做同样的事情。 一些64位系统同时具有intlong 64位。

    你写了:

    我已经提供了变量res不能超过整数限制的信息。

    最好小心使用术语。 尽管类型名称int显然是单词“integer”的缩写,但这些单词并不是同义词。 在C和C ++中, int只是几种整数类型之一; 其他包括unsigned charlong long

    想必你的意思是,价值res不能是类型的范围之外, int ,这是INT_MININT_MAX

    如果你使用long long的结果,可能会避免溢出; 然后可以将结果与值INT_MININT_MAX进行比较,并在超出范围时采取适当的纠正措施。 但是intlong long仍然有可能是64位。 你做什么取决于你的代码需要如何移植。

    事实之后,您无法安全地检查是否有符号整数加法或减法溢出。 已签名算术中的溢出会导致未定义的行为。 通常情况下,结果会回绕,但原则上,在有机会检查结果之前,程序可能会崩溃。

    一些编译器可能会提供执行安全签名算术的函数,并告诉您是否存在溢出。 请查阅您的编译器文档。

    在执行操作之前可以测试操作数。 他们很复杂,我懒得弄清楚细节,但是简要地说:

  • 如果+的操作数是相反的符号,或者如果一个操作数是0 ,则加法是安全的。
  • 如果两个操作数都是正数,如果x不超过INT_MAX - y ,则加法是安全的。
  • 如果两个操作数都是负数,那么如果y不小于INT_MIN - y ,则加法是安全的。
  • 我不保证上述内容是完全正确的*我只是把它写成了我的头顶),但在大多数情况下,它可能比它的价值更多的努力。


    信任但要验证:

    assert(a > 0);
    assert(b > 0);
    assert(c > 0);
    assert((long)a - (long)c + (long)b <= INT_MAX);
    
    int res = a - c + b;
    
    链接地址: http://www.djcxy.com/p/29809.html

    上一篇: Is it a good practice to use long int to avoid overflow?

    下一篇: Cluster member variables declaration by their type useful or not?