C の基本:演算と型変換
演算子
データの操作(演算、operation)を指示ずる為に使われる記号を演算子(operator)と呼びます。例えば1 + 1の+は加算という演算を表す演算子です。
C の数値型に対する演算子は以下のものがあります。
表記 | 意味 |
---|---|
+a | a の値そのもの |
-a | 反数 |
a + b | 加算 |
a - b | 減算 |
a * b | 乗算 |
a / b | 除算 |
a % b | 剰余 |
これらの演算の結果は、基本的に演算の対象と同じ型になります。特に整数型の除算は正負問わず小数点以下が切り捨てられる事をよく覚えておきましょう。
(C の剰余%はaが負の場合に0以下の値を取り6.5.5#6、所謂ユークリッド除算〈Euclidean division〉とは異なります。)
同じ加算+であっても、型によってビット列に対する実際の処理は異なります。整数型の場合は、二進数として単純に足せばよいのですが、浮動小数点数ならば仮数部が合う様に調節する必要があります。(尤も大抵は CPU が一つの命令としてその演算を用意しているので、プログラムからすれば呼ぶ命令の違いに過ぎませんが。)
型変換
値の型は次の様に書いて変換する事ができ、キャスト(cast)または明示的な型変換(explicit type conversion)と呼びます。
(変換先の型) 変換する値 |
例えば普通に1と書くとこれはint型の 1 になるのですが(「C の知識:リテラル」を参照)、
(double) 1 |
と書くとdouble型に変換されます。これは実際のバイト列(ビッグエンディアンの場合)を考えると次の変換が起こっています。
int | → | double |
---|---|---|
0x00 0x00 0x00 0x01 | 0x3F 0xF0 0x00 0x00 0x00 0x00 0x00 0x00 |
単なる(符号付きの)二進数と浮動小数点数で表現が全く異なる事に注意して下さい。
演算はint型とdouble型など、異なる型同士に対しても行えるのですが、実のところこうした演算は一度同じ型に合わせてから実行されます。これは暗黙の型変換(implicit type conversion)と呼ばれるもので、基本的に
- 符号無し整数型→符号付き整数型→実数型
- 精度の小さい方→大きい方
と値が保存される様に起こります。例えばint型とdouble型の加算ならば、int型がdouble型へと変換され、結果もdouble型になります。