2016-05-10 9 views
0

Javaに比較的新しいです。Javaで長いプリミティブを印刷するには

long a = 3232235521L; 
long b = 192 * 16777216 + 168 * 65536 + 0 * 256 + 1; 

System.out.println("a="+a); 
System.out.println("b="+b); 

出力:ここでは、コードで長い2^63-1のためのJavaドキュメントの最大値によると

a=3232235521 
b=-1062731775 

、それがある:9223372036854775807だからBのために、オーバーフローが存在しません、なぜbは3232235521ではないのですか?

答えて

0

コードの2行目では、すべてのオペランドが整数であるため、演算結果も整数になります。

結果(3,232,235,521)は整数(最大値は2^31-1)内に収まらないため、結果として整数オーバーフローになります。

したがって、正確な結果を得るには、長いリテラルを使用する必要があります。行2を以下のコードに変更します。

long b = 192L * 16777216L + 168L * 65536L + 0L * 256L + 1L; 

上記のコードで正しい出力が得られるはずです。

+0

最大値は、それが収まらないはずY 2^63-1'あります? –

+0

式の右辺には整数しかないので、個々の演算の結果は整数として設定されます。いずれの結果も '' int'''に収まらない場合、オーバーフローします。 – kkaosninja

0

整数のプリミティブは計算中に使用していますが、整数のオーバーフロー後に変換されるのは最後です。あなたは192L * 16777216L + 168L * 65536L + 0L * 256L + 1Lを使いたいかもしれません。

0

代入時に変換を行うのはその時点までです。すべてが整数であるため、計算の途中でオーバーフローが発生しています。

コードがなければならない: `長いため

long b = 192l * 16777216l + 168l * 65536l + 0l * 256l + 1l;