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

负数求和法

  •  1
  • raj247  · 技术社区  · 6 年前
    public void getSum(int a, int b) {
        int x=10;
        int y=-5;
    
        int ans = x;
        while (y != 0) {
            ans++;
            y--;
        }
        System.out.println("ans = " + ans);
    }
    

    这个程序给出了正确的答案,但我不明白怎么回答。因为 y -ve 我正在做 y-- 使它远离 0 而不是朝着它。那么这个程序是如何给我正确答案的呢?

    1 回复  |  直到 6 年前
        1
  •  1
  •   GBlodgett    6 年前

    一个 int 最大值为 2^31-1 最小值为 -2^31 . 当值超过这些值时,就会发生整数溢出,这就意味着您要遍历它,它会换行,数字变成相反的符号。(如果将一个添加到最大值,它将变为 -2147483648 )

    换一种说法吧。设想一个时钟,除了它从 0 2147483647 (在哪里 6 会的),然后立即 -2147483648个 ,然后返回到 0个 . (注意 -2147483648个 2147483647个 在哪一边 6个 会在一个固定的时钟上)

                             (0)
                              |
    
    
    
    
    (-1073741824) -           *               - (1073741823)
    
    
    
    
                              |  
                (-2147483648)   (2147483647)
    

    所以说 y 一只手开始 -5 开始向 -2147483648个 ,和 ans 是10,正在向 1073741823 . 随着循环的继续和 是的 一直逆时针移动, 是的 将从 -2147483648个 2147483647个 最终归零,退出循环。同时 答复 也会从 2147483647个 -2147483648个 然后停下来 ans == 5 .