Javaで整数を扱う型と取りうる範囲の紹介です。
整数の型 | ビット数 | 値の範囲 |
---|---|---|
byte | 8ビット | -128 〜 127 |
short | 16ビット | -32768 〜 32767 |
int | 32ビット | -2,147,483,648 〜 2,147,483,647 |
long | 64ビット | -9223372036854775808 〜 9223372036854775807 |
整数の最後にL
やl
をつけるとlong
型を表す。それ以外の整数はint
型を表します。
また、Java SE 7からアンダースコア「_
」を数値表現に使うことができます。アンダースコアはリテラルの先頭・末尾や、記号の前後には記述できないので注意してください。
🍣 整数型使い分けの指針
byte, char, short
: 整数型としては使わない。場合によってはint
より効率が悪いint, long
: 基本はint
を使う。int
より大きな値を扱う場合はlong
を扱う
🗻 ビット長と値の範囲
ビット長と表現可能な値の関係を考えます。下記はビット長が4の場合の符号なし整数と符号あり整数です。
出典元: 改訂2版 パーフェクトJava
😀 演算時の注意点
桁溢れ
その型の最大値に1プラスすると負数になります。これを「桁溢れ」と言います。
(絶対値の大きな負数にマイナス1する場合も同様)
int i = Integer.MAX_VALUE; // => 2147483647 |
桁溢れはセキュリティホールになりうるため、注意してください。
🏈 0(ゼロ)による割り算の実行例外
数値0(ゼロ)による割り算の実行例外、java.lang.ArithmeticException
のサンプルです。
int i5 = 0; |
😸 整数型の拡大変換とキャスト
狭い型(int)から広い型(long)への変換を拡大変換と呼び、代入可能です。
int = Integer.MAX_VALUE; |
一方で広い型(int)から狭い型(short)への変換はコンパルエラーになります。
その為、キャストを使います。
int i = 10; |
キャストはコンパイルエラーを招きやすいので、できるだけ使わない方がよいです。
🚜 昇格(演算時の自動的な型変換)
昇格とは、演算時に広い方の型へ自動変換して演算するしくみのことです。
変換のルールは次のとおりです。
- 演算の片方が
long
の場合は、long
に拡大変換 - 両方
long
でない場合は、int
に拡大変換
たとえば、次のコードはshort
にキャストしないとコンパイルエラーになります。
short s1 = 1; |
😼 リテラル値の特別な型変換
int
の整数リテラル値は、代入先の値が扱える範囲内ならキャストなしで代入可能です。
byte b = 127; |
代入先の値が扱えない範囲の場合はコンパイルエラーになります。
byte b = 128; //=> バイトに収まらないint型のリテラルのためコンパイルエラー |
🐝 8進数、16進数の整数リテラル
077
のように0
を接頭辞とすると、8進数となります0x3F
のように0x
を接頭辞とすると、16進数になります