public static void main(String[] args){
int x = -2000000000;
int z = 2000000000;
System.out.println(x - z);
}
Xiaobaiはそれを肉眼で見ました。結果は陽性ではなく陰性になるはずです。プログラムを実行すると、結果は294967296と表示されます。
解決策を探す
明らかに、xはzより小さく、その結果は負の数ですが、プログラムは294967296を出力します。これは正の数です。ふたつの数値の差がintの最大値と最小値の範囲を超えたと思い、あふれた?それを確認してください!
/**
* A constant holding the maximum value an {@code int} can
* have, 2<sup>31</sup>-1.
*/
@Native public static final int MAX_VALUE = 0x7fffffff;
intの最大値は2,147,483,647で、最小値は-2,147,483,648であるため、-2,000,000,000–2,000,000,000の値は、最小値-2,147,483,648よりも-4,000,000,000少なくなります。オーバーフローが発生します。オーバーフロー値を取得するにはどうすればよいですか?
public static void main(String[] args){
int x = -2000000000;
int z = 2000000000;
int max=Integer.MAX_VALUE;
System.out.println(Integer.toHexString(x));
System.out.println(Integer.toHexString(z));
System.out.println(Integer.toHexString(x-z));
}
-2,000,000,000の16進数値は0x88ca6c00です。
2,000,000,000の16進値は0x77359400です。
2つの減算された値の16進値は次のとおりです:0x1194d800(10進値294967296)
まとめ
intだけがこの問題に遭遇するだけでなく、byte、char、longなどもすべてオーバーフローに遭遇するため、それらのスコープを理解する必要があります。
• バイト: -128〜127(両端を含む)。
• short: -32768〜32767(両端を含む)。
• int: -2147483648〜2147483647(両端を含む)。
• long: -9223372036854775808〜9223372036854775807(両端を含む)。
• char: 「\ u0000」から「\ uffff」、つまり0〜65535を含みます。