Javaの整数型(long,int,short,byte)について


Javaで整数を扱う型と取りうる範囲の紹介です。

整数の型 ビット数 値の範囲
byte 8ビット -128 〜 127
short 16ビット -32768 〜 32767
int 32ビット -2,147,483,648 〜 2,147,483,647
long 64ビット -9223372036854775808 〜 9223372036854775807

整数の最後にLlをつけると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
System.out.println(i + 1); // => -2147483648 を出力

桁溢れはセキュリティホールになりうるため、注意してください。

🚕 0(ゼロ)による割り算の実行例外

数値0(ゼロ)による割り算の実行例外、java.lang.ArithmeticExceptionのサンプルです。

int i5 = 0;
System.out.println(4 / i5); //=> java.lang.ArithmeticException: / by zero

🍮 整数型の拡大変換とキャスト

狭い型(int)から広い型(long)への変換を拡大変換と呼び、代入可能です。

int = Integer.MAX_VALUE;
long l = i;

一方で広い型(int)から狭い型(short)への変換はコンパルエラーになります。
その為、キャストを使います。

int i = 10;
short s = (short)i; //=> 取りうる値の範囲なので可能

キャストはコンパイルエラーを招きやすいので、できるだけ使わない方がよいです。

🐮 昇格(演算時の自動的な型変換)

昇格とは、演算時に広い方の型へ自動変換して演算するしくみのことです。
変換のルールは次のとおりです。

  • 演算の片方がlongの場合は、longに拡大変換
  • 両方longでない場合は、intに拡大変換

たとえば、次のコードはshortにキャストしないとコンパイルエラーになります。

short s1 = 1;
short s2 = 1;
short sum = s1 + s2; // 右辺がintになっているため、右辺をshortにキャストが必要

🍣 リテラル値の特別な型変換

intの整数リテラル値は、代入先の値が扱える範囲内ならキャストなしで代入可能です。

byte b = 127;
short s = 32767;

代入先の値が扱えない範囲の場合はコンパイルエラーになります。

byte b = 128; //=> バイトに収まらないint型のリテラルのためコンパイルエラー

🗽 8進数、16進数の整数リテラル

  • 077のように0を接頭辞とすると、8進数となります
  • 0x3Fのように0xを接頭辞とすると、16進数になります

🎂 参考リンク

🖥 VULTRおすすめ

VULTR」はVPSサーバのサービスです。日本にリージョンがあり、最安は512MBで2.5ドル/月($0.004/時間)で借りることができます。4GBメモリでも月20ドルです。 最近はVULTRのヘビーユーザーになので、「ここ」から会員登録してもらえるとサービス開発が捗ります!

📚 おすすめの書籍