代码之家  ›  专栏  ›  技术社区  ›  chappar

Int32_Min/-1有什么问题?

c
  •  4
  • chappar  · 技术社区  · 16 年前

    约翰·雷格尔的博客文章 A Guide to Undefined Behavior in C and C++, Part 1 包含以下“safe”函数,用于“在不执行未定义行为的情况下执行整数除法”:

    int32_t safe_div_int32_t (int32_t a, int32_t b) {
      if ((b == 0) || ((a == INT32_MIN) && (b == -1))) {
        report_integer_math_error();
        return 0;
      } else {
        return a / b;
      }
    }
    

    我想知道当a=int32_min和b=-1时,除法(a/b)有什么问题。是否未定义?如果是为什么?

    4 回复  |  直到 7 年前
        1
  •  15
  •   muddybruin    16 年前

    我认为这是因为Int32_min的绝对值比Int32_max大1,所以Int32_min/-1实际上等于Int32_max+1,这会溢出。

    所以对于32位整数,有4294967296个值。
    负数有2147483648个值(-2147483648到-1)。
    零(0)有1个值。
    正数(1到2147483647)有2147483647个值,因为0从正数中减去了1个值。

        2
  •  3
  •   Justin Ardini    16 年前

    这是因为 int32_t 用二的补码表示,数字用 N 二进制补码范围内的位 −2^(N−1) 到 2^(N−1)−1 . 因此,当你进行除法时,你得到: -2^(31) / -1 = 2^(N-1) . 注意结果大于 2^(N-1)-1 ,表示溢出!

        3
  •  2
  •   AShelly    16 年前

    其他的海报对溢出的原因是正确的。大多数机器上溢出的含义是int_min/-1=>int_min。与-1相乘时也会发生同样的事情。这是一个意外的、可能是危险的结果。我看到一个定点电机控制器失控,因为它没有检查这种情况。

        4
  •  1
  •   Gangadhar    16 年前

    因为Int32_Min定义为(-Int32_Max-1)=-(Int32_Max+1),当除以-1时,这将是(Int32+Max)=>存在整数溢出。我得说,这是检查溢流的好方法。精心编写的代码。+1给开发商。