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

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

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

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

3.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).

   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 }


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

3.1.2 算術変換(p.64)

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

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

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

データの型を変更したい場合に明示的な型変換(キャスト)を使う.これを使うことにより, 倍精度実数型のデータを整数型に,あるいはその反対など,プログラマーのお望みの型に 変換できる.例えば,整数型のデータ ij の除算などに便利である. 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 }


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


no counter