代入式自体,値をもつことを見ました。ということは,代入式自体,型をもつはずです。何故ならば,C言語では,扱うデータのすべてがそれ固有の型をもつからです。仕様(C99)によると,
となっています。そこで疑問になるのが,異なる型の間の代入は,どのような変換が行われるかです。というのは「4.5. 変数のサイズ」で見たように,例えば,unsigned char は 255 までなのに対し,unsigned long int の最大値は 4294967295 ですから,unsigned long int型変数を unsigned char型へ代入すれば,値が収まらないことが起こりえます。
実は,異なる型の間の変換は,予め決まったルールに従います。
■型変換(Conversion)
char, short, int, long, long long 間の変換 [C99, 6.3.1.3]
unsigned を付している)ならば,変換先の型で許された範囲に収まるまで変換先の型の最大値に1を足した値を繰り返し足して(あるいは引いて)ゆく。
float, double, long double 間の変換 [C99, 6.3.1.5]
float から他,double から long double への変換では値は不変。
これらのルールは,単純代入演算子だけでなく,後に見る「キャスト演算子」も含め,ある型が他の型に変換されるときに適用されます。
/* Example 6.1 */
#include <stdio.h>
int main(void)
{
int n = 500;
unsigned char c = 0;
c = n;
printf("%u (%o, %x)\n", c, c, c);
return 0;
}
この例は,int型変数を unsigned char型へ変換したものです。変換指定子 %u は unsigned 用です。実行結果は次の通りです。
244 (364, f4)
unsigned char型の最大値は 255 なのでそれに 1 を足した 256 を 500 から引いた値となっています。