キャスト 型変換 切り捨て オーバーフロー - 萌えJava超入門
第七章 基本データ型の型変換

キャスト演算子

狭くする基本データ型変換(narrowing primitive)の場合は、
キャスト演算子によって、明示的に行います。

double dou = -273.15;
int num = (int)dou;


目次


1.キャスト演算子

重要
Javaでは変数のデータ型を変更することはできません。

そうなんですよね~。
何度見ても
ショックよね~。




より狭い範囲を表現するデータ型への変換は、暗黙的な型変換を行えません。
値の精度が落ちたり、表現可能な範囲を超えてしまうリスクを伴うためです。
このような変換を 狭くする基本データ型変換(narrowing primitive)といいます。

キャスト演算子を使って明示的に型変換を行えば、データ型の広さに関係なく型変換ができます。


キャスト演算子
(目的のデータ型)変数
カッコの中がデータ型だと、キャスト演算子と認識されます。

サンプルコード
 double dou = −273.15;
 int num = (int)dou;
サンプルコードでは、intに型変換している。
大体思い通りの挙動を示す。


重要
キャスト演算子はデータ型のサイズに関係なく型変換ができます。

double を int 型変換してみましょう。

//Sample09_14.java
class Sample09_14 {
    public static void main(String[] args){
        double dou = -273.15;
        int num = (int)dou;
        System.out.println("num = " + num);
        System.out.println("dou = " + dou);
    }
}

コマンドライン
>javac Sample09_14.java
>java Sample09_14
num = -273    ← 切り捨てが発生
dou = -273.15

小数点以下は
切り捨てられるのね。
範囲を超えちゃった
んすね~。
あえて切り捨てたいときに使う
常套手段だ。
覚えておくといい。

本来は、切り捨てられる可能性があるプログラムに対して、Javaはコンパイルエラーを出します。
そこをキャスト演算子によって、「意図的な切り捨て」を明示したので、
Javaは安心してコンパイルを通してくれます。



3.範囲を超える値の代入(整数型)


変換先のデータ型の範囲を超える値が代入されるとどうなるでしょうか。
↓の Sample09_16では、2147446517 を shortに型変換しています。
shortの範囲は -32768 ~ 32767 です。
とても収まりません。

ご参照 ↓
  Java超入門
    よく使いそうな資料一覧 基本データ型一覧

//Sample09_16.java
//NG
class Sample09_16 {
    public static void main(String[] args){
      int int_value = 2147446517;
      short short_value = (short)int_value;

      System.out.println("int_value:\t" + int_value);
      System.out.println("short_value:\t" + short_value);

      System.out.println(
          "int_bin:\t" + Integer.toBinaryString(int_value)
      );
      System.out.println(
          "short_bin:\t" + Integer.toBinaryString(short_value)
      );
    }
}

コマンドライン
>javac Sample09_16.java
>java Sample09_16
int_value:    2147446517
short_value:  28405
int_bin:      1111111111111110110111011110101
short_bin:    110111011110101

2147446517 が 28405 になってしまいました。
意味が分かりませんね。
shortにしたらピンク色の部分だけに
なってしまった。
2進数の上位16ビットが
落ちてしまったんだ。
収まる部分だけ残して
後は捨てられたんスか?
10進数で見ても
意味が分からないわね。

このように、データ型の範囲を超えた値を代入することで、
本来の値が表現できないことを「オーバーフロー」あるいは「桁溢れ」といいます。

キャスト演算子による型変換は、エラーを出さずに無理矢理にでも型変換します。
見方によっては、小数点以下の切り捨てと同じです。
型変換はデータ型の範囲に気をつけてくださいね。



4.範囲を超える値の代入(浮動小数点型)


浮動小数点型の場合は少し違います。
表現可能な範囲を超えてしまった場合、
大き過ぎる場合は Infinity(正の無限大)
小さすぎる場合は -Infinity(負の無限大) という値になります。

//Sample09_17.java
class Sample09_17 {
    public static void main(String[] args){

        double dou_max =  1.7976931348623157E308;
        double dou_min = -1.7976931348623157E308;

        System.out.println(
            "double to float over " + (float)dou_max
        );
        System.out.println(
            "double to float under " + (float)dou_min
        );
    }
}

コマンドライン
>javac Sample09_17.java
>java Sample09_17
double to float over Infinity
double to float under -Infinity

整数よりは親切ね。



まあそうだな。


お疲れ様でした。




© 2019 awasekagami