Java プリミティブデータ型に関するメモ。
プリミティブデータ型一覧
Javaにおけるプリミティブデータ型(基本データ型)には以下がある。
| 型 | 説明 | サイズ (bit) |
範囲 | 規定値 |
|---|---|---|---|---|
| byte | 符号付き整数 | 8 | -128 〜 127 | 0 |
| short | 符号付き整数 | 16 | -32,768 〜 32,767 | 0 |
| int | 符号付き整数 | 32 | -231〜231-1 (±21億1千万強) 桁数であれば9桁までOK。 |
0 |
| long | 符号付き整数 | 32 | -263〜263-1 (±922京3千兆強) 桁数であれば18桁までOK。 |
0L |
| float | 単精度浮動小数点 | 32 | 有効桁数 約7桁(10進数) 絶対値が1.4e-45 〜 3.4028235e+38の正負数 1.17549435e-38未満は非正規化数となり精度が低下する。 |
0.0f |
| double | 倍精度浮動小数点 | 64 | 有効桁数 約16桁(10進数) 絶対値が4.9e-324 〜 1.7976931348623157e+308の正負数 2.2250738585072014e-308未満は非正規化数となり精度が低下する。 |
0.0d |
| boolean | 真偽値 | 1 | true または false |
false |
| char | Unicode文字 | 16 | \u0000 〜 \uFFFF |
\u0000 |
プリミティブデータ型に対応するラッパークラス
各プリミティブデータ型には対応したラッパークラスが存在する。
ラッパークラスは型の値をオブジェクトとして表現できるほか、型固有の操作や定数などが定義されている。
| プリミティブデータ型 | ラッパークラス |
|---|---|
| byte | java.lang.Byte |
| short | java.lang.Short |
| int | java.lang.Integer |
| long | java.lang.Long |
| float | java.lang.Float |
| double | java.lang.Double |
| boolean | java.lang.Boolean |
| char | java.lang.Character |
MIN_VALUEとMAX_VALUE
java.lang.Character以外のラッパークラスには定数 MIN_VALUE と MAX_VALUE が定義されており、そのプリミティブデータ型が扱える 最小値と最大値を表す。
浮動小数点とMIN_VALUE
符号付き整数のラッパークラスの定数 MIN_VALUE は負の最小値を表すが、
浮動小数点のラッパークラスの定数 MIN_VALUE は**正の最小値(表現できる最も0に近い数)**である点に注意。
また浮動小数点のラッパークラスには正規化数の最小値を表す定数 [MIN_NORMAL] (https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Float.html#MIN_VALUE)が定義されており、
MIN_VALUE 以上、MIN_NORMAL 未満の値は非正規化数 となる。
オートボクシング
プリミティブデータ型と対応するラッパークラス型は型としては別ものではあるが、 Java5から導入されたオートボクシング機能によって直接代入することができる。
プリミティブデータ型からラッパークラス型への変換をボクシング、その逆をアンボクシングと呼ぶ。
Integer wi = 10; // ボクシング
int pi = Integer.valueOf(10); // アンボクシング
アンボクシングの際、ラッパークラス型のオブジェクトがnullだとNullPointerException
が発生する。
もしメソッド呼び出しが無いにも関わらずNullPointerExceptoionが発生しているスタックトレースを見かけたらこのnullオブジェクトのアンボクシングを疑うと良い。
符号なし整数
Javaにおけるプリミティブデータ型の整数は全て符号付きだがJava8から各ラッパークラスに符号なし整数として扱うための各種メソッドが追加された。
例:java.lang.Integerの符号なし整数を扱うための各種メソッド
- public static int compareUnsigned(int x, int y)
- 整数として比較する。
- public static int divideUnsigned(int dividend, int divisor)
- 符号なし整数として除算した商を返す。
- public static int parseUnsignedInt(String s)
- 引数の文字列が表す10進数を符号なし10進数としてパースする。
- public static int parseUnsignedInt(String s, int radix)
- 基数指定付きで引数の文字列が表す符号なし整数をパースする。
- public static int remainderUnsigned(int dividend, int divisor)
- 符号なし整数として割った余りを返す。
- public static loとしてng toUnsignedLong(int x)
- 符号なしLongへ変換する。
- public static String toUnsignedString(int i)
- 符号なし整数として文字列として返す。
- public static String toUnsignedString(int i, int radix)
- 基数指定付きで符号なし整数として文字列として返す。
プリミティブデータ型変換
拡大変換
以下のケースは拡大変換と呼ばれる。
暗黙的に変換されるためキャストが不要。
| 変換元 | 変換先 |
|---|---|
| byte | shrot、int、long、float、double |
| short | int、long、float、double |
| char | int、long、float、double |
| int | long、float、double |
| long | float、double |
| float | double |
上記の整数から浮動小数点の拡大変換のうち、int -> float 、long -> float 、long -> double のケースでは 元の整数型が扱える桁数が変換先である浮動小数点型の有効桁数を超えているためIEEE754の最近接丸め(Round-to-nearest)が発生する場合がある。
縮小変換
以下のケースは縮小変換と呼ばれる。
明示的なキャストが必要。また縮小変換は変換先の型の方がサイズが小さい(または精度が低い)ため元の情報の一部を失うことになる。
| 変換元 | 変換先 |
|---|---|
| short | byte、char |
| char | byte、short |
| int | byte、short、char |
| long | byte、 short、char、int |
| float | byte、 short、 char、 int、 long |
| double | byte、 short、 char、 int、 long、 float |
プリミティブ型の符号付き整数は内部的に2の補数表現で値が保持されている。
縮小変換がかかると変換先に収まりきる下位ビット以外は切り捨てられその結果を2の補数表現として解釈される。
例:int型65535をbyte型へ縮小変換
int i = 65535; // 0b1111_1111_1111_1111
byte b = (byte)i; // 下位1バイトが残る0b1111_1111
System.out.println(b);
-1 // 0b1111_1111の2の補数表現(ビットを反転して1を足した結果の負数)
拡大縮小変換
byteからcharの変換はbyte -> int の拡大変換で一時的にint型となり int -> byte 縮小変換でcharに変換される。
プリミティブデータ型のリテラル表現
プリミティブデータ型のうちリテラル表現可能なデータ型は、 int long float double char boolean となっている。
int型のリテラルは基数に応じた以下の表記が可能。
| 基数 | 表記 | 例 |
|---|---|---|
| 10 | プレフィックスなし | 777 |
| 2 | 0bプレフィックス |
0b0011_0000_1001 |
| 8 | 0プレフィックス |
0001_411 |
| 16 | 0xプレフィックス |
0x0319 |
int型以外のリテラル表記は以下。
| 型 | 表記 | 例 |
|---|---|---|
| long | Lまたはlサフィックス |
777L |
| float | Fまたはfサフィックス |
777.777f |
| double | Dまたはdサフィックス |
777.777d |
| boolean | true または false |
true |
| char | シングルクォートで囲む | '7' |