Java Xiaobaiがピットレコードを踏む-データ操作のオーバーフローに注意を払う

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を含みます。

元の記事952件を公開 1820年に賞賛 89万回の閲覧

おすすめ

転載: blog.csdn.net/Dream_Weave/article/details/105443020