CodeGym /Java Blog /ランダム /Javaでlongをintに変換する方法
John Squirrels
レベル 41
San Francisco

Javaでlongをintに変換する方法

ランダム グループに公開済み
この記事では、 Java でlong をintに変換する方法を説明し、いくつかのコード例を書きます。long はintよりも大きなデータ型であるため、ここではそのような変換には型キャストを使用する必要があります。おそらくすでにご存じのとおり、Java のlongint はどちらもプリミティブ データ型です。つまり、それらはクラスオブジェクトではありません。すべてのオブジェクトと配列はヒープ スペースに保存され、 intlongなどのプリミティブ型はスタック メモリに保存されます。 Longint は似ています。整数とは、正、負、またはゼロの整数を意味します。どちらも長いint は整数型であるため、ある意味互換性があります。問題は、long型の範囲が -263 ~ 263 – 1、または -9223372036854775808 ~ 9223372036854775807 であることです。つまり、Java プログラムは、long 型に 64 ビットを割り当てます。同時に、int型は 32 ビットを占有し、そこに -231 ± 231 - 1、または同じ -2147483648 から 2147483647 までの数値を入れることができます。これは、任意の数の int 型を簡単に 1 つの型に収めることができることを意味しますロングタイプ。Java では、プリミティブを操作する場合、狭い型から広い型への変換が自動的に行われます。別の言い方ではワイドニングとも言います。

int myInt= 18;
long myLong= 16000;
       myLong = myInt;
ここでは、 int をlong変数に 代入しています。すべてがスムーズに進み、より広い範囲では、より小さな範囲では静かに収まり、メモリ領域以外は何も失われませんでした。ちなみに、long型の変数を宣言してその値を定義するときは、それに文字lを割り当てるとよいでしょう。これは、 intの範囲外の数値を扱うときに便利です。

long myVeryLong = 10000000000l;

Javaのlong型からint型への変換

さて、この記事の主なタスクである Java のlongからintへの変換に戻りましょう。問題は、より大きなものが常により小さなものに適合するとは限らないことです。したがって、Java では「小さい」を「大きい」に自動的に置き換えることはできません。前の例のように動作しようとしますが、その逆の場合は次のようになります。

//example without typecasting…nice trying! 
public static void main(String[] args) {

int myInt= 18;
long myLong= 16000;
       myInt = myLong;
}
Java コンパイラではこれを行うことができず、エラーがスローされます。したがって、この操作では、いわゆる型キャストを使用する必要があります。この処理をナローイング型変換と呼びます。変数を絞り込むには、値をキャストする型を明示的に指定する必要があります。これは、1 つの「小さい」 long 数値(収まるはず) をintに代入し、2 つの「大きな」 long数値をintの範囲 外に代入しようとする例です。

public class longToInt {

   public static void main(String[] args) {

       int myInt = 18;
       long myLong = 16000;
       long myVeryLong = 2147483648l;//l in the end means ‘long’ 
       long myVeryLong = 10000000000l;

       myInt = (int) myLong;
       System.out.println(myInt);
       myInt = (int) oneMoreLong;
       System.out.println(myInt);
       myInt = (int) myVeryLong;
       System.out.println(myInt);
   }
}
私たちはコンパイラに、 long値をint変数に 入れたいことを通知しており、この決定の結果については私たちが責任を負います。コンパイラは、より狭い型の明示的な指示を確認して、変換を実行します。結果として、次の出力が得られます。
16000 -2147483648 141006540​​8
そうですね、16000 は間違いなく予想通りですが、-2147483648 がマイナスなのはなぜでしょうか? そして、この 141006540​​8 は何を意味するのでしょうか? 実際のところ、そのような数値は長い変数に格納されており、私たちが覚えているように、この変数は 64 ビット必要です。これらの数値を32 ビットのみを格納できるint変数に入れようとしています。原則として、これらの 32 個のセルには、長い数値の最初の 32 ビットの 0 と 1 が含まれ、残りは単純に破棄されます。したがって、元の数値が 32 ビットに収まらない場合、収まらないビットは単純に破棄されます。必要なビット数が 32 ビット未満であるため、正しい数値 16000 のみが存在するのはそのためです。

Java 8のlong型からint型への変換

Java 8 では、Mathクラスに、 longをintに変換する新しいメソッドがあります。ここにあります:

Math.toIntExact(value);
このメソッドの最も優れた点は、変換された数値の長さを制御し、値が大きすぎて int に収まらない場合は例外をスローすることです。この例でこれがどのように機能するかを見てみましょう。

public class intToLong {

   public static void main(String[] args) {

       int myInt = 18;
       long myLong = 16000;
       long oneMoreLong = 2147483648l;
       long myVeryLong = 10000000000l;
      
       System.out.println(Math.toIntExact(myLong));
       int y = Math.toIntExact(oneMoreLong);
       System.out.println(oneMoreLong);
       System.out.println(Math.toIntExact(myVeryLong));
   }
}
出力は次のとおりです。
16000 スレッド "main" java.lang.ArithmeticException での例外: intToLong.main(intToLong.java:13) の java.base/java.lang.Math.toIntExact(Math.java:1080) での整数オーバーフロー
したがって、プログラムは正しく変換された唯一の数値 16000 を出力し、その後、範囲外の数値 2147483648l をintにプッシュしようとすると、メソッドは例外をスローしました。したがって、古典的な Java のlongからintへの変換の場合のように、ビットが破棄されるという問題は発生しません。
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION