Java Java-データ型のキャスト-
数値型データのキャスト
- 数値型データ同士はお互いに暗黙的、明示的に代入することができる。
- データ範囲の小さなものから、大きなものは暗黙的に代入できる
(例)
int num;
long bignum;
bignum=num; // OK
- データ範囲の大きなものから小さなものへの代入するときは、明示的にデータをキャストする必要がある。もし、キャストしなければコンパイルエラー
(例)
int num;
long bignum;
num=(int)bignum; // データ型を()で囲んでキャストすればOK
キャストしていい場合
- 実際に入っているデータが小さくて、代入しても問題がない場合
- 入りきれないときに切り捨てても構わない場合
整数と小数の変換
整数 → 小数 キャストが必要
小数 → 整数 キャスト不要
(例)
int num=1234;
char c=(char)num;
char型から整数値
char型の用途は文字であるが内部的には整数なので整数値へのキャストができる
(例)
int num=1234;
char c=(char)num;
doubleリテラル
float f=1.2 →コンパイルエラー
末尾にf又はFがついていないのでこのリテラルはdouble型の為
したがって
float f=(float)1.2 → OK
しかし、通常は float f=1.2f と記述する。
誤差
型変換や算術演算によりデータの一部分が失われる場合がある
桁落ち
(例)
int num =3/2;
int num=(int)1.5;
小数点以下が切り捨てられる。
桁あふれ
(例)
int num=10000*10000*10000; // intの最大値を超える
整数の上限値の範囲を超えるような演算や代入をした場合は正しい結果にならない
丸め誤差
(例)double d=1-2*4;
結果は、かっちり0.2にはならない
浮動小数は10進数ではなく2進数の計算の為10進数ではっきり書ける数も微妙に誤差がでる
異なるデータ型の数値演算
- int型 + long型 = long型
- int型 + double型 = double型
- 2項演算時の昇格ルール
- 一方のオペランドがdouble型の場合他方もdouble型にする
- 一方のオペランドがfloat型に場合は他方もfloat型にする
- 一方のオペランドがlong型の場合は他方もlong型にする
- 両オペランドをint にする(例)char+char=int