Javaについて徹底解説!

Javaの整数型intを一から解説 値の範囲、他の型・Stringとの変換も

大石 英人

開発エンジニア/Java20年/Java GOLD/リーダー/ボールド歴2年

Javaのintは、プリミティブ型の一つで、32ビットの範囲で整数を表現できます。intでは、およそ±215千万の値を表現できます。

Javaで整数を扱う時は、普通はintを使います。intを使わないJavaのプログラムは考えられないほど、ごく普通に使われます。ですので、intを使うことは、Javaプログラミングの基本だとも言えるでしょう。

だからこそ、intの特徴や使い方をしっかり知っているということは、Javaでプログラミングをする上でもはっきりとした足場や土台があるということです。それくらいJavaプログラミングではintは重要です。

この記事ではintについて、そもそもintとはどういうものか、intはどうやって使うのか、気を付けたい所などを初心者向けにお伝えします。

※この記事のサンプルは、Java 11の環境で動作確認しています


1.intはJavaの整数型のスタンダード

intはJavaで最もよく使う整数のデータ型で、プリミティブ型(primitive、基本データ型)と呼ばれるものの一つです。

一つのintのサイズは32ビット(4バイト)です。intという名前の由来は、英語のinteger(整数)の先頭部分です。

intを他のプリミティブ型と簡単に比較すると、以下のとおりです。

データ型 値の種類 ビット数 表現できる値の範囲 接尾語 備考
boolean 真偽値 1ビット true/falseのどちらか
byte 整数 8ビット(1バイト) -128~127
short 整数 16ビット(2バイト) -32,768~32,767
char 文字 16ビット(2バイト) 0~65,535 Unicode文字、\u0000\uffff
int 整数 32ビット(4バイト) -2,147,483,648~
2,147,483,647
±2147百万、Unicodeコードポイント
long 整数 64ビット(8バイト) -9,223,372,036,854,775,808~
9,223,372,036,854,775,807
Lまたはl ±922
float 浮動小数点 32ビット(4バイト) ±3.40282347E+38~ 1.40239846E-45 Fまたはf 単精度
±3.4×1038乗~約±1.4×10-45
double 浮動小数点 64ビット(8バイト) ±1.79769313486231570E+308~±4.94065645841246544E-324 Dまたはd

倍精度
±1.8×10308乗~約±4.9×10-324

1-1.intは1ずつ増減し、プラスマイナスがある整数型

整数型とは、プログラム上で数字を表現するデータ型の一つです。整数は-10123…のように、ちょうど1ずつ増減する数値で、小数点は含みません。小数点の数値を含められるデータ型は、浮動小数点型という別のものです。

Javaではプラスの整数、マイナスの整数の両方をintだけで表現します。他のプログラミング言語では、符号のないデータ型がありますが(unsigned intなど)Javaintは符号があるデータ型です。

1-2.intは±21億ぐらいまでの整数を表現できる

Javaのintでは、±215千万くらいまでの整数を表現できます。正確に書けば、-2,147,483,6482,147,483,647の範囲の整数です。

32ビットの2進数で表現できるパターンは約43億とおりなので、少ないと思われたかもしれません。でも、Javaでのintはもっとも大きな桁の1ビットをプラスマイナスの符号に使いますので、数値に使えるサイズは31ビット(21)になるのです。

intの32ビットのビットパターンと、実際の数字は以下のように対応します。

8バイト目 7~2バイト目 1バイト目 10進数表現 備考
0000 全て0 0000 0 すべてのビットが0
0000 全て0 0001 1
0000 全て0 0010 2
0111 全て1 1110 2,147,483,646
0111 全て1 1111 2,147,483,647 Integer.MAX_VALUE
1000 全て0 0000 -2,147,483,648 Integer.MIN_VALUE
1000 全て0 0001 -2,147,483,647
1111 全て1 1110 -2
1111 全て1 1111 -1 すべてのビットが1+1すると0に戻る

intは0から始まって1ずつ大きくなり、32ビット目が0かつ131ビット目が全て1が最も大きな正の整数です。そこから、次の32ビット目が1かつ031ビット目が全て0が最も小さな負の整数で、1ずつ大きくなっていき、全てのビットが1になると-1です。

1-3.Javaのintはいつでもどこでも32ビット

Javaではどの環境でも、昔も今もこれからも、int32ビットです。「それが何なの? 当然でしょ?」と思われたかもしれませんが、実はこれがJavaのいいところの一つです。

他のプログラミング言語では、このような基本的なデータの大きさにも、環境による違いがあったりします。例えば、昔のC言語ではint16ビットでしたが、今では大体32ビットです。さらに、今ではint16/int32/int64などがあり、きちんと理解して使うにはなかなか複雑です。

ですが、Javaでは最初からint32ビットです。これは今後もずっと変わりません。どんなJavaの環境でも同じですし、プログラムの作り直しはいらないのです。覚えやすさと言う意味でもいいことですよね。


2.intの基本的な使い方

ここでは、intの使い方のサンプルをお伝えします。そして、intを使う上では注意すべきことがいくつかありますので、それらも順番にお伝えします。

2-1.intの宣言の仕方、初期値

2-1-1.intの変数・配列の宣言、初期値の指定

intは型の一つですから、以下のように変数や配列変数の型として使えます。もちろんメソッドの引数や、戻り値としても使えます。

2-1-2.intのリテラルの書き方

小数点の無い数字をプログラム上にそのまま書くと、Javaのプログラム上ではintとして認識されます。このような書き方をリテラル(文字どおりの、という意味)と呼びます。

intのリテラルを書く時は、接頭語をつけなければ10進数です。Java 11の時点では10進数の他に以下の書き方ができます。さらに、“_”で桁区切りが出来るようにもなっています。

  • 2進数(“0b”で始まる、Java 7から)
  • 8進数(“0”で始まる)
  • 10進数(接頭語なし)
  • 16進数(“0x”で始まる)

2-1-3.intのフィールド、配列の初期値は0

フィールドとしてint型の変数を使ったり、int型の配列を使う場合は、未初期化だと0になります。

2-2.intを使った四則演算

intを使った四則演算(加減乗除)には、四則演算用の算術演算子、つまり+-*/を使います。余りを求めるなら%です。ですので、ごく直感的に計算できるかと思います。

ただし、計算結果で小数点が出た場合、intの変数へ代入すると、小数点以下の値は切り捨てされます。これは整数型のプリミティブに共通する動きです。

2-1-1.大きな整数を計算するなら、符号の変化に要注意!!

絶対値が大きな値を使う場合は、符号の変化に注意しましょう。

intに数値を加減算して、プラス側の最大値を超えるとマイナス側の最大値になり、マイナス側の最小値よりも小さくなるとプラス側の最大値になります。つまり、プラスマイナスがひっくり返るタイミングがあり、オーバーフローと呼ばれます。

これは、二進数で言うと 0111111111111111111111111111111 1000000000000000000000000000000 の間でプラスマイナスが変わるということです。前者がInteger.MAX_VALUE、後者がInteger.MIN_VALUEです。これを細かく言えば、Javaでは2の補数でマイナスの数値を表現しているから、ということです。

問題になる例として、業務システムで金額項目をintにして、その金額同士を足し合わせると予期せぬ数値になることがあります。例えば、15億と10億を足しても25億にはならないのです。計算する数値の桁数が大きいなら、もっと大きな数が扱えるlongdoubleにしておくといいでしょう。

2-3.intでのビット演算

intはビット演算にも使えます。業務向けのプログラムではビット演算はほとんど使いませんが、科学技術計算など処理速度が要求されるプログラムでは、ビット演算により計算をすることもあります。特に、掛け算や割り算をシフトで代用するのが代表的です。

なお、C言語の名残があるプログラムだと、処理のオプションをビットパターンで指定することがあったりします。また、プログラムの仕様として特定ビットの値が1かどうかを調べることもありますので、ビット演算のやり方は覚えておいても損はありません。

以下では、Javaintを使ったビット演算のやり方だけ、簡単に示しておきます。

2-4.intと他のプリミティブ型との変換

Javaでは数値型のプリミティブ型として、intとビット数が違う整数(byte/short/char/long)と、小数点が扱えるもの(float/double)があります。それらとの変換や演算の時には注意することがいくつかあります。

2-4-1.整数のプリミティブ型との変換

ビット数が違うものとの変換では、ビット数が小さい型大きい型への変換は問題ありません。intなら、byte/short/charからの変換です。ビット数が小さい型の値は、ビット数が大きい方の型で全て表現できるからです。

でも、ビット数が大きい型小さい型へ変換する場合は、大きい型の上位ビットにある情報が消えてしまいます。intならlongからの変換が要注意です。

また、ビット数が大きい型から小さい型に変換する際は、明示的なキャストが必要です。これは、値が失われる可能性がある操作をしているのだと、プログラマに意識させるためです。

ビット数が小さい型から大きな型へはキャストはいりませんが、ここでも暗黙的キャストというものが行われています。

逆に、intから変換する場合は、それぞれのプリミティブのビット数までの値になります。longならintよりも大きいので、値をそのまま保持できます。

下記の例だと、byte/short/charはそれぞれのビットが全て1になります。ビットが全て1だと、整数型なら共通で-1です。

2-4-2.浮動小数点のプリミティブ型との変換

浮動小数点のプリミティブ(float/double)intの間で変換をすると、浮動小数点数にはあった小数部が失われてしまいます。また、浮動小数点はintよりもはるかに桁が大きな数値を表現できますが、そういう大きな桁の情報もなくなってしまいます。

float/doubleからintに変換する際は、値が失われる可能性がある操作なので、明示的なキャストが必要です。逆に、intからfloat/doubleへの変換にはキャストは不要です。

2-5.intとStringとの変換

Stringもintと並んでJavaでは重要なクラスです。Stringintにすること、またintStringにすることは、プログラムでは日常茶飯事です。ここではその方法をお伝えします。

2-5-1.String→intの変換

ファイルから読み込んだ文字列や、引数で受け取った文字列からintを作りたい時があります。そういう時はInteger.parseIntを使いましょう。文字列をintに変換してくれます。intと解釈できない文字列の場合はNumberFormatExceptionthrowされますのでご注意を。

2-5-2.int→Stringの変換

逆に、intStringにしたい時があります。簡単に行うなら、Integer.toString(int)か、String.valueOf(int)を使いましょう。ちなみに、どちらを使っても結果は同じです。

また、int3桁区切りなどでフォーマットしたり、0埋めをしたい場合もあるでしょう。その場合は、java.text.DecimalFormatString.formatを使います。それぞれの書式の詳細は、Javadocを参照してください。

java.text.DecimalFormat

https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/text/DecimalFormat.html

 

java.lang.String.format

https://docs.oracle.com/javase/jp/11/docs/api/java.base/java/lang/String.html#format(java.lang.String,java.lang.Object…)


3.intとInteger

Javaでは32ビットの整数を表現するために、intIntegerの二つの方法があります。Javaプログラミングの初心者は、なぜ同じ整数の表し方が二つあるのか混乱すると思います。

この章ではその理由と、intIntegerの使い分けの方針などをお伝えします。

3-1.二種類の表現方法は性能確保のため

Javaではプリミティブ型のintと、クラスのIntegerは別物です。C#などではこういう区別がないのに、なぜJavaではあるのか。これは、Javaが生まれた当時にプログラムの実行速度を確保するためでした。

Javaは1995年に登場したプログラミング言語です。当時のCPUのクロック周波数は今とは桁が違い、一般向けのCPUでようやく100MHzを超えたくらい。メモリの量も全体で数MB~数10MBと非常に乏しかったものです。

intは32ビットの数字そのものなので、楽に速く扱えます。しかし、intをクラスとすると、一つのintの数値を表すのに32ビットよりもずっと多くのメモリを使います。簡単な計算をするにも、処理上では余分なオーバーヘッドが発生します。

3-2.クラスのIntegerならnullを表現できる

JavaでIntegerを使うのは、Integerが持つメソッドを使いたい時と、値がない場合すなわちnullを表現したい時です。例えば、SQLでは値の有り無しをNULLかどうかで表現できますが、それをJavaintでは上手に表現できません。

ですから、プログラム上では0-1999などの値に特別な意味を持たせたり、Integer.MAX_VALUEMIN_VALUEを使うのですが、確実さには欠けます。そういう値のチェックを忘れるなどのミスもしがちです。

そういう時に参照型であるIntegerを使えば、値がないことをnullとして表現できるのです。Integerをどういう時に使うか分からない方は、その変数でnullを表現する必要があるかを一つの指針にしてみてください。

3-3.オートボクシングでintIntegerを自動変換する

Java 1.5でオートボクシング(auto boxing)という仕組みが導入されました。オートボクシングで、intIntegerをプログラム上でほぼ同じものとして扱えます。

プログラム上でintを使う所ではIntegerを使えますし、Integerを使う所ではintが使えます。本当のプログラム上は相変わらずintIntegerは別物なのですが、その違いをJavaが裏で自動的に変換をしてくれるのです。

これでJavaの面倒な部分がある程度解消されました。ですが、前述のとおりIntegernullを表せますが、intは必ず何かの整数なので、nullに相当するものがありません。

ですので、以下のように予期せぬところでNullPointerExceptionが発生したりします。これは2019年のJava 11の時点でも変わっていません。プログラマが注意するか、Optionalを使う必要があります。

3-4.【応用】符号なしintとしての扱い方

この記事ではずっと、intはプラスマイナスがある32ビットの整数だとお伝えしてきました。それは今も変わりませんが、Java 8intを符号なし整数として扱えるメソッドがIntegerに追加されました。それらのメソッドを使うと、int32ビットをフルに使った計算ができます。

例えば以下のようにです。比較しているのは同じintでビットパターンも変わりませんが、compareUnsignedでは32ビット目も含めた整数として比較しているのが分かるでしょうか。

Integer.~Unsigned系のメソッドは以下のものです。それぞれの詳細は、Javadocを参照してみてください。

Integer.toUnsignedString:符号なし整数として文字列化する

Integer.parseUnsignedInt:符号なし整数としてパースする

Integer.toUnsignedLong:符号なし整数としてlongに変換する

Integer.divideUnsigned:符号なし整数として割り算する

Integer.remainderUnsigned:符号なし整数として余りを求める


4.まとめ

この記事では、Javaintについてお伝えしてきました。Javaint32ビットの整数で、±21億くらいまでの値を表現できます。intJavaで整数を使う時の標準ともいえるデータ型です。

Javaでは、整数を表現するにはプリミティブ型のintと、クラス(参照型)としてのIntegerの二種類があり、それらは違うものであることには注意しましょう。ただ、オートボクシングにより違いが見えにくくはなっています。

さて、整数はどんなプログラミング言語にもあるデータ型です。ですので、Javaで整数の使い方を学んでおけば、他のプログラミング言語でもそう大きな違いなく使えるでしょう。

特にビットパターンと数値の対応を覚えておけば、いざという時に役に立つかもしれません。それに、ビットパターンがイメージできれば、コンピュータの世界により深く入り込めるようになります。これを機に、頑張ってみませんか?

『技術力』と『人間力』を高め市場価値の高いエンジニアを目指しませんか?

私たちは「技術力」だけでなく「人間力」の向上をもって遙かに高い水準の成果を出し、関わる全ての人々に感動を与え続ける集団でありたいと考えています。

高い水準で仕事を進めていただくためにも、弊社では次のような環境を用意しています。

  • 定年までIT業界で働くためのスキル(技術力、人間力)が身につく支援
  • 「給与が上がらない」を解消する6ヶ月に1度の明確な人事評価制度
  • 平均残業時間17時間!毎週の稼動確認を徹底しているから実現できる働きやすい環境

現在、株式会社ボールドでは「キャリア採用」のエントリーを受付中です。

まずは以下のボタンより弊社の紹介をご覧いただき、あなたの望むキャリアビジョンをエントリーフォームより詳しくお聞かせください。