メモリーに格納されているビットの並びを考えると,コンピューターでは同じ型の変数同
士で演算を行うのが望ましい.プログラマーはそのようにソースコードを書くべきである
が,避けられないこともある.そのようなときに,暗黙の型変換,あるいは明示的な型変
換(キャスト)が使われる.
教科書には代入時型変換・関数の引数型変換・単項型変換・算術変換が書かれているが,
諸君にとって重要なのは,最初と最後の型変換である.暗黙の型変換は,いろいろとルー
ルが書かれているが,精度の高い方に変換され,プログラマーにとって都合の良い仕様な
ので,あまり気にする必要はない.唯一,整数と整数の除算のみ気を付ければよい.C言
語では,整数同士の除算の結果は整数となる.これについては,後の練習問題で体験して
もらう.
代入演算子(
=)は,右辺の変数の値を,左辺の変数に代入する.右辺と左辺の型が異
なる場合に,型変換が行われる.リスト
1をみて,動作の内容を理
解して欲しい.
- 9行
- 倍精度実数型(double)の値を整数型(int)の変数へ代入
- 10行
- 整数型(int)の値を倍精度実数型(double)の変数へ代入
- 12行
- 変数 j を10進数(%d)で,y の値を浮動小数点数
(%f)で表示(教科書p.322変換指定子).これらの間に,タブ
(
t)で適当な空白を入れている(教科書p.28表2-4).
1 #include <stdio.h>
2
3 int main(void){
4 int i,j;
5 double x,y;
6
7 i=123;
8 x=4.567;
9
10 j=x;
11 y=i;
12
13 printf("j = %d\ty = %f\n", j, y);
14
15 return 0;
16 }

j = 4 y = 123.000000
リスト
1の結果について,以下を考えよ.
- [練習1]
- 代入時型変換が行われている行を示せ.また,代入時型変換
が行われていない行を示せ.
- [練習2]
- 実行結果がなぜそのようになったか考えよ.
コンピューター内部で算術演算の処理を行う場合,それは同じ型の方が都合がよい.同じ
性質のビット列の方が都合が良いことは明らかである.そのため,演算を行う2つ型が異
なる場合,どちらかに統一しなくてはならない.C言語では,表現能力の高い型へ統一さ
れて演算が行われることになっている.
倍精度実数と整数の演算を行う場合,それは倍精度実数で計算されるので,プログラマー
は気にしなくて良いのである.反対に,整数型に統一されると,桁落ちにより計算精度が
著しく低下する.これを避けるようにC言語の仕様は決まっている.
データの型を変更したい場合に明示的な型変換(キャスト)を使う.これを使うことにより,
倍精度実数型のデータを整数型に,あるいはその反対など,プログラマーのお望みの型に
変換できる.例えば,整数型のデータ
i と
j の除算などに便利である.
i=3, j=4として,
i/jを計算すると
0 になってしまいプログラマーの意
図したとおりに動作しない.このときに,
(doubel)iとして,整数型の変数の値を一
時的に倍精度実数にして計算すると問題が解決される.
- 9行
- 整数変数 i の値を一時的に,倍精度実数に変換している.そうすると,
倍精度実数と整数の除算になる.次に,暗黙の型変換が適用され,最終的には倍
精度実数同士の除算になり,倍精度実数の演算結果が得られる.
1 #include <stdio.h>
2
3 int main(void){
4 int i,j;
5 double x;
6
7 i=3;
8 j=4;
9
10 x=(double)i/j;
11
12 printf("x = %f\n", x);
13
14 return 0;
15 }

x = 0.750000
以下の練習問題を実施せよ.
- [練習1]
- リスト2を書き換えて,以下の結果を調べよ.
そして,その理由を考えよ.
|
x=i/j |
|
x=i/4. |
|
x=i*1.0/j |
|
|
x=(double)(i/j) |
|
x=i/(double)j |
|
|
ホームページ:
Yamamoto's laboratory著者:
山本昌志
Yamamoto Masashi
平成18年5月2日