『Cプログラミング専門課程』目次第4章メモリ

4.4 型の変換 (1)


整数型および浮動小数点型で、異なる型同士の演算は、コンパイラがより高 い優先順位の型に変換してしまいます。優先順位は、

	char < short < long < float < double
となっています。つまり、
	式1   <演算子>   式2
の演算を行なうと、計算結果の型は、式1と式2の型のうち、より高い方の型 になります。

ただし、代入演算子

	式1   =   式2
は、右辺の型が左辺の型に変換されてから代入され、式全体が左辺の型になり ます。一味変わった3項演算子
	式1 ?  式2  :  式3 
の型は、式2と式3の型のうち、より高い方の型になります。

したがって、普通に式を書いている限りは、常により高い優先順位の型、つ まり、より精度の高い型に変換されます。式は普通に書けば常に精度は保たれ ます。せいぜい気にしなければならないのは、整数型同士の演算で、結果がオー バーフローするときでしょう。

大抵の本には以上のような説明があるでしょう。しかし、これは ANSI C の 規格にきちんと従っていません。ANSIでの「格上げの優先順位」は、

    int < unsigned int < long < unsigned long < float < double
となっています。そして、int型より低い優先度の型は、無条件にint型になり ます。これは、式中にint型より低い型があれば、それら全てをint型に無条件 に昇格させてから、その後、上の格上げ優先順位に従って演算が行なわれる度 に演算結果の型を決めていけば、最終的な式の型が決まります。

つまり、intより低い整数型は、メモリ上では存在するのですが、計算式の 中では存在しません。これは、次のプログラムで確認できます。

サンプルプログラム

   1: /*  charadd.c  --  char型の加算 */
   2: 
   3: #include        
   4: 
   5: main()
   6: {
   7:         printf( "%d %d %d %d\n", 'a', 'b', 'c', 'd' );
   8:         printf( "%d\n", 'a'+'b'+'c'+'d' );
   9: }

実行結果

97 98 99 100
394

char型である 'a', 'b', 'c', 'd' の値はそれぞれ 97, 98, 99, 100 です。 char型はsignedなので、2つの文字を足すと127を超えて負数になります。4 つを足すとどうなるのでしょう。でも、結果は全てをint型として加算した394 になっています。

*常識*
  • int型より低い整数型は式の中には存在しない。

⇒⇒⇒⇒次ページへ


Copyright1996 Hirofumi Fujiwara. No reproduction or republication without written permission
『Cプログラミング専門課程』目次第4章メモリ