arrow_back

いろいろな変数の型

「Java言語で小数点以下を扱える型はfloatとdoubleの二つがあるよ」
「えっと、変数の宣言の型を変える……これでいいの?」
float value = 1 / 3;
「そうそう、そんな感じ。ハルキもだいぶ慣れてきたね。 変数の型には、他にもこんなのがある」
名前 表現できる値
int 32ビット整数 -231 〜 231-1
long 64ビット整数 -263 〜 263-1
float 32ビット浮動小数点 2-149 〜 (2-2-23) * 2127
(どちらも有限値)
double 64ビット浮動小数点 2-1074 〜 (2-2-52) * 21023
(どちらも有限値)
byte 8ビット整数 -128 〜 127
short 16ビット整数 -215 〜 215-1
char 16ビットUnicode文字 \u0000 〜 \uFFFF
boolean 真偽値 true / false
String 文字列 オブジェクト型
「いっぱいあるんだね。やっぱりそれぞれ違うものなの?」
「もちろん。まずは格納できるのが数値か、それ以外かで分けられるね。 数値の場合は小数点以下を扱えるかどうか。どれくらい大きい、小さい数値を扱えるかっていうのも重要」
「んー、よくわからない……私——才能ないのかなぁ」
「気にしない気にしない。最初のうちはそんなものだって。今はあるって事だけわかってればいいの」
「杏ちゃん……」
「ハルキができるようになるまで、あたしがちゃんと教えてあげるから、少しずつでいいから勉強していこうね」
「あ、あのね。杏ちゃん」
「うん? どうしたの?」
「さっき直したプログラムを動かしてみたんだけど、やっぱり答えが0になるの……」
「えええぇっ!」
「何度か試してみたけど、ずっとこのままだよ……私、なにか変なことしちゃったかな」
「あわわわわ。そんなはずは……ちょっともう一度プログラム見せて」
float value = 1 / 3;
「あ、そうか!」
「なにか、わかったの?」
「あのね。この計算結果。確かにfloat型に格納されてるんだけど、1 / 3の計算はint型でされてる。 だから、計算結果は0になったってわけ」
「けど、float型に入れるんなら小数点以下が出るんじゃ?」
「float型に格納される前の時点で0だからvalueがfloat型でも意味はないよ。 Javaでは、普通に整数をプログラム中に書くとint型として扱われるきまりがあるの」
「むむむむ……?」
「この場合、計算時点で浮動小数点として計算することを示してあげないとダメ。 そのためにはキャストしないと」

型のキャスト

「キャストを使えば、変数の型を強制的に変更できる。例えばこんな風にすると」
float value = 1f / 3;
「1の後ろにfをつけるんだね」
「そう。ここでいうfはリテラルっていうんだけど。 数値の後ろにfがついていると、その数値はfloat型として取り扱うことになるの。 それを割る3の方も自動的に型が変わって、float型同士の計算結果としてvalueに格納されるよ」
「本当だ! ちゃんと小数点以下が出てきた!」
「計算する数値の中で、いちばん表現できる値が大きい型に自動的にキャストされる。 これを暗黙のキャストっていうよ。 あと、暗黙のキャストと対になる明示的キャストというのもあるんだけど、それはこんな感じ」
int value1 = 1;
int value2 = 3;
float value = (float) value1 / value2;
「括弧書きで、この変数はこの型として扱いますよって書いてキャストするのが明示的なキャスト」
「変数value2は、暗黙のキャストがされることになるの?」
「そうそう。ちなみに、例ではvalue1をfloat型にキャストしてるけど、これはvalue1の値がfloat型にキャストされると言うだけで、 変数value1そのものの型が変わるわけじゃないから注意してね」
「杏ちゃん。もう一つ質問いいかな。キャストってのを試した計算結果、 私は0.333333ってずっと続くと思ってたんだけど……画面では最後の数字が4になってるの」
「ああ、それは内部表現っていって、 コンピューターのむずかしい話になるからここでは詳しくは説明しないけど…… じゃあ、精度の高い浮動小数点型のdoubleの方を試してみよっか」
int value1 = 1;
int value2 = 3;
double value = (double) value1 / value2;
「ちゃんと全部3になったね!」
「本当なら無限に3が続くんだけど、コンピュータが表現できる値には限界があるんだよ。 これを意識しておかないと、計算が合わなくなったりするから気をつけて」
「……」
「じゃあ、変数についてはまだまだ言い足りないけどAndroidの方に戻って、今度は入力側をやってみよう。 文字入力を受け取る部品を……って、ハルキ?」
「……」
「どうかしたの?」
「いや、結果が0のままだって言ったときの杏ちゃんの慌てた顔を思い出してたんだよ。 杏ちゃんも、あんなミスしたりするんだねぇ」
「……」
最終更新日: 2015/09/03