感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

数値型

<スポンサーリンク>

名著「パーフェクトJava」を復習したので、まとめ。

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)

  • 作者: アリエル・ネットワーク株式会社,井上誠一郎,永井雅人,松山智大
  • 出版社/メーカー: 技術評論社
  • 発売日: 2009/09/24
  • メディア: 大型本
  • 購入: 26人 クリック: 360回
  • この商品を含むブログ (35件) を見る

Javaの数値について。
■整数型
・Javaでは整数を扱うために5種類の整数を提供している。
byte: -128以上127以下
char:0以上65535以下
short:-32768以上32767以下
int:-2147483648以上2147483647以下
long:-9223372036854775808以上9223372036354775807以下

・上記をビット長で見ると・・・
byte:8bit
char:16bit
short:16bit
int:32bit
long:64bit

ビット(bit)とは、2つの状態をとる事象を、情報として抽象化した時の情報の単位のこと。
binary digitの略から作られた用語である。

なお64bitより大きい数値を扱うにはBigIntegerクラスやBigDecimalクラスを使う。


■値の範囲の違いのために方を分ける理由
・効率性
long型は他の4つの型の範囲をすべて含む範囲の値を表現できる。
しかし、long型はint型の2倍のメモリ領域を使う。
また一般的にlong型数値の演算速度はint型より少し遅くなる。

・互換性
古いプログラムはメモリ容量やファイル容量を節約するために、狭い整数型のサイズでファイルをの保存したり、ネットワークにデータを流したりすることがある。
このようなプログラムと連携するときに、ファイルを書きだしたりネットワークにデータを送り出す場合に広い整数型を使っていると、
誤って本来あるべき範囲を超えた値を書き込む危険性がある。

・文字の扱い
charはcharacterの略称。文字に関連した型である。
負の値をとらないのはcharだけ。


short,int,longの使い分けでは、最初の指針は「どれでもいいならintを使う」

リテラル表記とは、コード上に書いた正数値がそのままの意味を持つ仕組みのこと。
Lまたはlで終わる整数リテラルの型はlong型。
例)
1 ⇒int型
1L ⇒long型

・Javaの文字は内部的には16ビットの数値である。
Unicodeという体系で、文字に対して一意に数値を割り振る。
文字'0'は内部的にはu0030の16ビットの数値となっている。

・文字から数値への変換
Characterクラスのクラスメソッドdigitを使う。
int n1 = Character.digit('1',10);

・数値から文字に変換する
CharacterクラスのクラスメソッドforDigitを使う
char c1 = Character.forDigit(0,10);


■型変換
整数値の代入にはゆるい規則が許されている。
狭い型の値を広い型の変数に代入することが可能。
int i = 100;
long ll = i;
これはOK。

狭い型の値をより広い範囲を扱う型の変数に代入するときの値の変換を拡大変換という。
広い型の値を狭い型の変数に代入するのはコンパイルエラーになる。
これを縮小変換という。

縮小変換を完全に禁止するのは不便なため、代入可能にするのがキャスト(cast)である。
キャストは括弧付きで型を書くことで代入可能になることを言う。
int i = 0;
short si = (short)i;

キャストにより縮小変換すると、あふれたビットは切り捨てられる。
予期せぬエラーを引き起こす可能性があるので、キャストは基本的には避ける。

参照型変数にもキャストを使うことができる。
継承上位の型から継承下位の型へキャストすることをダウンキャストという。
ダウンキャストはバグの元になる。

■浮動小数点数とは
・Javaは実数を表す型としてfloatとdoubleを提供している。
float:32bit
double:64bit

floatとdoubleでは、特にメモリの制約が厳しくない限りはdoubleを使うのが一般的である。

■浮動小数点数の特別値
・POSITIVE_INFINITY:正の無限大
・NEGATIVE_INFINITY:負の無限大
・NaN:Not a Number

■数値ラッパークラス
数値ラッパークラスを使う場面
・数値をオブジェクトとして扱いたい場合
・コレクションの用途に数値を使う場合

数値クラスのインスタンス化の方法例
Integer i = Integer.valueOf(1);

数値クラスはnew演算子ではなく、valueOfを使うべき。

Booleanクラスはif文やwhile文の条件式の評価値の型として有効である。
nullになる可能性もあることを考慮すること。

ボクシング変換とは、基本型数値と数値ラッパークラスのオブジェクトを自動的に変換する仕組みのこと。

List list = new Arraylist();
list.add(1);
list.add(2);
list.add(3);
など、数値クラスを意識せずに使うことができるのはボクシング変換の恩恵である。

数値オブジェクトから基本型数値への変換をアンボクシング変換という。
int i = list.get(0);<参考>
パーフェクトJava (PERFECT SERIES) (PERFECT SERIES 2)