leetcode奇技淫巧-int最大値と最小値オーバーフロー
文書ディレクトリ前面 intタイプ限界 境界の誤りのコード を求めます境界の正しいコードを求めます 前面
これは私がleetcodeを塗ったときに見つけた問題で、小さな記録をしました.
intタイプ限界
Javaではintタイプが4バイト、2進32ビットであり、デフォルトでは記号が付いているため、31ビットのみがデジタルビットであり、先頭は正数か負数かを決定するのに用いられるが、intの限界値は以下のようになることが分かった. int最大値:2147483647 int最小値:-2174483648 負数の絶対値は正数より1大きい
境界の誤りのコードを求めます
上から、最小値の絶対値が最大値より1大きいことがわかります.一般的にこの数字は覚えられません.直接求めましょう.
結果は次のとおりです.
これはオーバーフローではありませんか.このとき、私たちは0でそれを減らします.それは依然として変わらないです.s-1を実行すると、ちょうどintの最大値であることがわかります.だから、この点に注意してください.もし私たちが別のs=-1を始めたら、最後に1を加えたり、1を減らしたりしなくてもintの最小値を得ることができます.
境界の正しいコードを求めます
方法1:
まず最大を算出してから最小を算出する
方式2:
まず最小を算出してから最大を算出する
これは私がleetcodeを塗ったときに見つけた問題で、小さな記録をしました.
intタイプ限界
Javaではintタイプが4バイト、2進32ビットであり、デフォルトでは記号が付いているため、31ビットのみがデジタルビットであり、先頭は正数か負数かを決定するのに用いられるが、intの限界値は以下のようになることが分かった.
境界の誤りのコードを求めます
上から、最小値の絶対値が最大値より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));