メモリーに格納されているビットの並びを考えると、コンピューターでは同じ型の変数同
士で演算を行うのが望ましい。プログラマーはそのようにソースコードを書くべきである
が、避けられないこともある。そのようなときに、暗黙の型変換、あるいは明示的な型変
換(キャスト)が使われる。
教科書には代入時型変換・関数の引数型変換・単項型変換・算術変換が書かれているが、
諸君にとって重要なのは、最初と最後の型変換である。暗黙の型変換は、いろいろとルー
ルが書かれているが、精度の高い方に変換され、プログラマーにとって都合の良い仕様な
ので、あまり気にする必要はない。唯一、整数と整数の除算のみ気を付ければよい。C言
語では、整数同士の除算の結果は整数となる。これについては、後の練習問題で体験して
もらう。
代入演算子(
=)は、右辺の変数の値を、左辺の変数に代入する。右辺と左辺の型が異
なる場合に、型変換が行われる。リスト
1をみて、動作の内容を理
解して欲しい。
- 9行
- 倍精度実数型(double)の値を整数型(int)の変数へ代入
- 10行
- 整数型(int)の値を倍精度実数型(double)の変数へ代入
- 12行
- 変数 j を10進数(%d)で、y の値を浮動小数点数
(%f)で表示(教科書p.322変換指定子)。これらの間に、タブ
(
t)で適当な空白を入れている(教科書p.28表2-4)。
j = 4 j = 123.000000
リスト
1の結果について、以下を考えよ。
- [練習1]
- 代入時型変換が行われている行を示せ。また、代入時型変換
が行われていない行を示せ。
- [練習2]
- 実行結果がなぜそのようになったか考えよ。
コンピューター内部で算術演算の処理を行う場合、それは同じ型の方が都合がよい。同じ
性質のビット列の方が都合が良いことは明らかである。そのため、演算を行う2つ型が異
なる場合、どちらかに統一しなくてはならない。C言語では、表現能力の高い型へ統一さ
れて演算が行われることになっている。
倍精度実数と整数の演算を行う場合、それは倍精度実数で計算されるので、プログラマー
は気にしなくて良いのである。反対に、整数型に統一されると、桁落ちにより計算精度が
著しく低下する。これを避けるようにC言語の仕様は決まっている。
データの型を変更したい場合に明示的な型変換(キャスト)を使う。これを使うことにより、
倍精度実数型のデータを整数型に、あるいはその反対など、プログラマーのお望みの型に
変換できる。例えば、整数型のデータ
i と
j の除算などに便利である。
i=3, j=4として、
i/jを計算すると
0 になってしまいプログラマーの意
図したとおりに動作しない。このときに、
(doubel)iとして、整数型の変数の値を一
時的に倍精度実数にして計算すると問題が解決される。
- 9行
- 整数変数 i の値を一時的に、倍精度実数に変換している。そうすると、
倍精度実数と整数の除算になる。次に、暗黙の型変換が適用され、最終的には倍
精度実数同士の除算になり、倍精度実数の演算結果が得られる。
x = 0.750000
以下の練習問題を実施せよ。
- [練習1]
- リスト2を書き換えて、以下の結果を調べよ。
そして、その理由を考えよ。
|
x=i/j |
|
x=i/4. |
|
x=i*1.0/j |
|
|
x=(double)(i/j) |
|
i/(double)j |
|
|
ホームページ:
Yamamoto's laboratory著者:
山本昌志
yamamoto masashi
平成17年5月14日