Javaをはじめよう!第16回~char型の変換規則~
2016/04/25
はじめに
前回は縮小変換(byte,short型)についてご紹介いたしました。
今回はchar型の変換規則について詳しくご紹介いたします。
演算子
char型の変換規則
char型のデータ範囲内の正の値であれば、byte型、short型同様、特別に縮小変換がされます。また、正の値であっても、byte型→char型、short型→char型、char型→short型、char型→byte型に型変換する時は、明示的にキャスト演算を行って型変換する必要があります。
実際にソースを見てみましょう。
Sample25.java
[code]
package chap02;
class Sample26{
public static void main(String[] args){
byte b = 123; //①範囲内の値のため縮小変換
short s = 123; //②範囲内の値のため縮小変換
char c = 123; //③範囲内の値のため縮小変換
c = b; //④byte型→char型 byte型の負の値がchar型で範囲外のためキャストが必要
c = s; //⑤short型→char型 short型の負の値がchar型で範囲外のためキャストが必要
b = c; //⑥char型→byte型 char型の正の値がbyte型の範囲外のためキャストが必要
s = c; //⑦char型→short型 short型の正の値がchar型の範囲外のためキャストが必要
}
}
[/code]
実行例
型の不一致: byte から char には変換できません
型の不一致: short から char には変換できません
型の不一致: char から byte には変換できません
型の不一致: char から short には変換できませんat chap02.Sample26.main(Sample26.java:8)
では、コンパイルエラーにならないように、sample26.javaのソースをすべてキャスト変換してみましょう。
Sample26.java(変更後)
[code]
package chap02;
class Sample26{
public static void main(String[] args){
byte b = 123;
short s = 123;
char c = 123;
c = (char)b;
c = (char)s;
b = (byte)c;
s = (short)c;
}
}
[/code]
これでコンパイルエラーはなくなります。char型は少し特殊ですが、データの範囲外を指す可能性がある場合は、キャスト演算が必要であることを理解してください。
データ型のデータ範囲を越えた値を、キャスト演算をした場合の特徴について説明します。
Sample27.java
[code]
package chap02;
public class Sample27 {
public static void main(String[] args){
int i = 128, i2=257;
byte b= (byte)i;
byte b2 = (byte)i2;
System.out.println(b);
System.out.println(b2);
}
}
[/code]
1
いかかでしょうか?意外な結果ではないでしょうか。何故こうなるかは、ビット単位で表示すると分かりやすいです。
int型の128をビット表示すると、00000000 00000000 00000000 00000000 10000000 です。
これをbyte型にキャストすると、先行0(24ビット分)が切り捨てられ、10000000になってしまうのです。
正の値と負の値を表現するために、先頭が1の時は負の値を表現するのでしたね。そのため、-128という値が表示されたのです。
もう一つのint型の257はビット表示すると、00000000 00000000 00000001 00000001 になります。
これをbyte型にキャストすると、byte型は1バイトなので、、上位の3バイトの値は失われます。
byte型の1バイトの部分だけを表示すると00000001 ですから、これはbyte型の表現では、1を表します。このように明示的にキャストを行う場合には、値が、予想もしないものになる可能性がありますので、注意下さい。
さいごに
今回は、char型の変換規則について詳しく紹介いたしました!
次回は算術昇格について詳しく紹介いたします!