leetcode奇技淫巧-int最大値と最小値オーバーフロー


文書ディレクトリ
  • 前面
  • intタイプ限界
  • 境界の誤りのコード
  • を求めます
  • 境界の正しいコードを求めます
  • 前面
    これは私がleetcodeを塗ったときに見つけた問題で、小さな記録をしました.
    intタイプ限界
    Javaではintタイプが4バイト、2進32ビットであり、デフォルトでは記号が付いているため、31ビットのみがデジタルビットであり、先頭は正数か負数かを決定するのに用いられるが、intの限界値は以下のようになることが分かった.
  • int最大値:2147483647
  • int最小値:-2174483648
  • 負数の絶対値は正数より1大きい
    境界の誤りのコードを求めます
    上から、最小値の絶対値が最大値より1大きいことがわかります.一般的にこの数字は覚えられません.直接求めましょう.
    int s = 1;
    for (int i = 1; i <= 31; i++) {
    	s *= 2;
    }
    System.out.println(s);
    

    結果は次のとおりです.
    -2147483648
    

    これはオーバーフローではありませんか.このとき、私たちは0でそれを減らします.それは依然として変わらないです.s-1を実行すると、ちょうどintの最大値であることがわかります.だから、この点に注意してください.もし私たちが別のs=-1を始めたら、最後に1を加えたり、1を減らしたりしなくてもintの最小値を得ることができます.
    境界の正しいコードを求めます
    方法1:
    まず最大を算出してから最小を算出する
    int s = 1;
    for (int i = 1; i <= 31; i++) {
    	s *= 2;
    }
    //    
    System.out.println(s-1);
    //    
    System.out.println(0-(s-1)-1);
    

    方式2:
    まず最小を算出してから最大を算出する
    int s = -1;
    for (int i = 1; i <= 31; i++) {
    	s *= 2;
    }
    //    
    System.out.println(s);
    //    
    System.out.println(0-(s+1));