代入式自体,値をもつことを見ました。ということは,代入式自体,型をもつはずです。何故ならば,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 から引いた値となっています。