2 型変換(教科書の5章)

メモリーに格納されているビットの並びを考えると、コンピューターでは同じ型の変数同 士で演算を行うのが望ましい。プログラマーはそのようにソースコードを書くべきである が、避けられないこともある。そのようなときに、暗黙の型変換、あるいは明示的な型変 換(キャスト)が使われる。

2.1 暗黙の型変換(p.62)

教科書には代入時型変換・関数の引数型変換・単項型変換・算術変換が書かれているが、 諸君にとって重要なのは、最初と最後の型変換である。暗黙の型変換は、いろいろとルー ルが書かれているが、精度の高い方に変換され、プログラマーにとって都合の良い仕様な ので、あまり気にする必要はない。唯一、整数と整数の除算のみ気を付ければよい。C言 語では、整数同士の除算の結果は整数となる。これについては、後の練習問題で体験して もらう。

2.1.1 代入時型変換(p.62)

代入演算子(=)は、右辺の変数の値を、左辺の変数に代入する。右辺と左辺の型が異 なる場合に、型変換が行われる。リスト1をみて、動作の内容を理 解して欲しい。
9行
倍精度実数型(double)の値を整数型(int)の変数へ代入
10行
整数型(int)の値を倍精度実数型(double)の変数へ代入
12行
変数 j を10進数(%d)で、y の値を浮動小数点数 (%f)で表示(教科書p.322変換指定子)。これらの間に、タブ ( $ \backslash$t)で適当な空白を入れている(教科書p.28表2-4)。
\begin{lstlisting}[caption=代入時型変換の例,label=prog:type_trans]
...

\fbox{実行結果}
	j = 4   j = 123.000000
リスト1の結果について、以下を考えよ。
[練習1]
代入時型変換が行われている行を示せ。また、代入時型変換 が行われていない行を示せ。
[練習2]
実行結果がなぜそのようになったか考えよ。

2.1.2 算術変換(p.64)

コンピューター内部で算術演算の処理を行う場合、それは同じ型の方が都合がよい。同じ 性質のビット列の方が都合が良いことは明らかである。そのため、演算を行う2つ型が異 なる場合、どちらかに統一しなくてはならない。C言語では、表現能力の高い型へ統一さ れて演算が行われることになっている。

倍精度実数と整数の演算を行う場合、それは倍精度実数で計算されるので、プログラマー は気にしなくて良いのである。反対に、整数型に統一されると、桁落ちにより計算精度が 著しく低下する。これを避けるようにC言語の仕様は決まっている。

2.2 明示的な型変換(キャスト)

データの型を変更したい場合に明示的な型変換(キャスト)を使う。これを使うことにより、 倍精度実数型のデータを整数型に、あるいはその反対など、プログラマーのお望みの型に 変換できる。例えば、整数型のデータ ij の除算などに便利である。 i=3, j=4として、i/jを計算すると 0 になってしまいプログラマーの意 図したとおりに動作しない。このときに、(doubel)iとして、整数型の変数の値を一 時的に倍精度実数にして計算すると問題が解決される。
9行
整数変数 i の値を一時的に、倍精度実数に変換している。そうすると、 倍精度実数と整数の除算になる。次に、暗黙の型変換が適用され、最終的には倍 精度実数同士の除算になり、倍精度実数の演算結果が得られる。
\begin{lstlisting}[caption=キャストを使用した例,label=prog:cast]
...

\fbox{実行結果}
	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日


no counter