[C言語入門] 演算子の使い方(8)
高木です。おはようございます。
いい加減、このネタも引っ張り過ぎな気がします。
でも、中途半端で終えるわけにもいかないので最後まで行きます。
今回は乗除演算子です。
今回は、いつもに比べればちょっと短いと思います。
乗除演算子はそれだけ簡単だということです。
それでは早速行ってみましょう。
乗除演算子
Cの乗除演算子は、乗算(掛け算)、除算(割り算)、そして剰余算(整数の余りの計算)のための演算子です。
乗算には2項の*演算子を、除算のためには/演算子を、剰余算のためには%演算子を使用します。
乗除演算子はすべて2項演算子で、両方のオペランドは算術型でなければなりません。
%演算子のオペランドは、両方とも整数でなければなりません。
/演算子と%演算子の第2オペランド(右側のオペランド)がゼロの場合は未定義の動作になります。
乗除演算子を評価するにあたっては、両方のオペランドに対して「通常の算術型変換」を行います。
「通常の算術型変換」については別の機会で解説できればと考えていますが、興味のある方は自分で検索してみてください。
/演算子のオペランドが両方とも整数の場合、小数点以下を切り捨てた値(ゼロ方向丸め)が結果となります。
また、%演算子の結果は、a/bが表現できる場合、(a/b)*b + a%b
はa
に等しくなります。
a/bが表現できる場合ということは表現できない場合もあります。
b
がゼロの場合もそうですが、オーバーフローする場合もあるのです。
たとえば、a
とb
がそれぞれint型で、int型が16ビットの場合を考えてみましょう。
このとき、負の値の内部表現には2の補数が使われるものとします。
a
の値が-32768、b
の値が-1のとき、評価結果はオーバーフローしてしまいます。
-32768を-1で割った結果は+32768ですが、これは16ビットのint型では表現できないからです。
ところで、C99より前の規格では、/演算子のオペランドの符合が異なる場合(正÷負、または負÷正の場合)、小数点以下を切り上げるか切り捨てるかは処理系定義でした。
これに伴って、%演算子についても、オペランドの符合が異なる場合の結果は処理系定義でした。
現存する処理系がすべて切り捨てとして振る舞うからこそC99では必ず切り捨てになったので、現実には気にする必要はないでしょう。
%演算子のオペランドは両方とも整数でなければなりません。
実浮動小数点数に対する剰余算を行いたい場合は、fmod関数(float版はfmodf、long double版はfmodl)を使うとよいでしょう。
ちょうど1000文字を超えたようなので、今回はここまでにします。
次回は加減演算子を解説する予定です。