sixty-life

還暦を迎えた今、独学でプログラミング学習をする日々の記録

いろいろなデータ型④データ型のキャスト

 

基礎からのJava 改訂版

Part 02 Chapter 06(P.87)

数値データ同士は、データ型が違う変数を代入することも可能です

データ型が小さいintから大きなlongへの代入は普通にできる。

public class Renshu_ori_3 {
public static void main(String args) {
int num = 10;
long bignum = num;
System.out.println(num);
System.out.println(bignum);
}
}

  datatype java Renshu_ori_3

10

10

 

逆に大きなlongから小さいintに代入するとコンパイルエラーになる。

public class Renshu_ori_3 {
public static void main(String args) {
long bignum = 10;
int num = bignum;
System.out.println(num);
System.out.println(bignum);
}
}

  datatype javac Renshu_ori_3.java

Renshu_ori_3.java:4: エラー: 不適合な型: 精度が失われる可能性があるlongからintへの変換

        int num = bignum;

                  ^

エラー1個

longからintなど、大から小に代入する場合はデータが入りきらない可能性があるのでエラーになる。

大から小へ代入したい場合は、明示的にデータ型を変換する必要がる。この型変換をキャストという。

 

キャスト演算子

(<データ型>)<値>

 

public class Renshu_ori_3 {
public static void main(String args) {
long bignum = 10;
int num = (int)bignum; // キャストすればOK
System.out.println(num);
System.out.println(bignum);
}
}

  datatype java Renshu_ori_3      

10

10

 

「代入しても問題ない」場合、または「入りきらない場合は捨ててよい」場合にキャストを使う

「捨ててよい」というのは少数を整数にに入れる場合に小数点以下を切り捨てるなど、精度が落ちてもいいような場合のこと。

違うデータ型はダメ

キャストできるのは数値型同士などに限る。(int型の変数をboolean型にキャストするということはできない)

ただしcharについては、用途は文字なのですが内部的には整数として扱われているので整数値とのキャストが可能。

public class Renshu_ori_3 {
public static void main(String args) {
int num = 10;
char c = (char)num;
System.out.println(num);
}
}

  datatype java Renshu_ori_3      

10

整数と少数の変換

整数から小数にはキャスト演算子なしで代入可能

public class Renshu_ori_3 {
public static void main(String args) {
double d = 10; // 整数から少数はキャスト不要

System.out.println(d);
}
}

  datatype java Renshu_ori_3      

10.0

 

少数をキャストした場合、小数点以下は切り捨てられる

public class Renshu_ori_3 {
public static void main(String args) {
int num = (int)1.2; // 小数から整数へはキャスト必要

System.out.println(num);
}
}

  datatype java Renshu_ori_3      

1

doubleリテラル

float型(4バイト浮動小数)の変数に1.2など小数リテラルが代入できないのも、この大から小への型変換になるから。

fをつけない小数リテラルはdouble型と見なされるので、精度の大きいdoubleから小さいfloatにそのまま代入できないが、キャストすれば代入することは可能。

public class Renshu_ori_3 {
public static void main(String args) {
float f = (float)1.2;

System.out.println(f);
}
}

  datatype java Renshu_ori_3      

1.2

ただし、コンパイルが通るという説明のためだけのコードで普通はこう書かない。普通は1.2fと書けばいい。

public class Renshu_ori_3 {
public static void main(String args) {
float f = 1.2f;

System.out.println(f);
}
}

  datatype java Renshu_ori_3      

1.2

  da

 

本日ここまで。

学習テキスト

基礎からのJava 改訂版