混合演算とデータ型について

最終更新日:2004-06-27.

今回は、混合演算とデータ型についてちょっと。

・混合演算とデータ型

Cでは、演算を行う際、同じデータ型の値を使用することが基本との
ことです。
これは、それぞれのデータ型で表現できる値の範囲が異なるからです。
でも、データ型が異なる変数間の演算を行うこともできます。
その際、上位のデータ型に型変換されて処理が行われます。
型変換(キャスト)を使用するには、(int)のように
使用したいデータ型の名前を指定します。

例えば、以下のような異なるデータ型の変数があるとします。
(下記のint型は16ビットとします。)

char a=12;
int b=345;

この場合、変数aはchar型で8ビット、変数bはint型で16ビットです。
そして、(a+b)の値はint型の16ビットとして求められます。

上記「a+b」は「357」で、これは簡単に分かります。

この「a+b」の値をint型の変数bに代入すれば正しい結果が得られます。
しかし、char型の変数aに代入すると8ビット部分のみが代入されるため
正しい結果は得られません。

b=(a+b);

・型変換(キャスト)について。

混合演算では、異なるデータ型の変数を使用しても
自動的に型変換が行われます。

処理を行っているとき、型変換を行いたいことがあります。
そのようなときには、変数の前に変換したいデータ型を指定します。

例えば、 (int)a のように。

メモリを確保するための関数の中に malloc() というものがあります。
これは、任意のデータ型で任意のサイズのメモリを確保するというものです。
そして、処理が成功したら、確保したメモリの先頭アドレスを返します。

そのような場合にも型指定などによって返された値を処理することができます。
例えば、以下のような感じで・・・。

(char *)malloc()
(int *)malloc()
(long *)malloc()

のように・・・。

では、ソースにしてみましょう。
+------------------------------------------------------------+
/* filename=no023-1.c */
/* include */
#include <stdio.h>
/* main */
int main( )
{
int i;
char a, b, c;
char wk[16];
a=100, b=200;
c=a+b;
printf("× %d+%d=%d\n", a, b, c);
i=a+b;
printf("○ %d+%d=%d\n", a, b, i);
printf("int iが表現できる数値の範囲。\n");
i=0;
printf("符号なしの場合%uから%u。\n", i, i-1);
printf("符号付きの場合");
i=-1;
while( 1 ){
sprintf(wk, "%d", i);
if( wk[0]!='-' ){
i++;
break;
}
i--;
}
printf("%dから", i);
i=1;
while( 1 ){
sprintf(wk, "%d", i);
if( wk[0]=='-' ){
i--;
break;
}
i++;
}
printf("%dまで。\n", i);
return 0;/* 終了 */
}
+------------------------------------------------------------+

上記をコンパイルして実行すると、以下のように表示されました。
× 100+200=44
○ 100+200=300
int iが表現できる数値の範囲。
符号なしの場合0から65535。
符号付きの場合-32768から32767まで。

戻る