記事内にはプロモーションが含まれています

【C言語】剰余演算子「%」の使い方まとめ!負の数や実数の余りを求めるfmod関数も解説

【C言語】剰余演算子「%」の使い方まとめ!負の数や実数の余りを求めるfmod関数も解説 C言語

C言語でプログラミングを行う際、割り算の「余り」を求める処理は頻繁に登場します。

偶数か奇数かの判定、時間の計算、配列のインデックスをループさせる処理など、その用途は多岐にわたります。

しかし、C言語の剰余演算には、負の数を扱った際の挙動や、実数(浮動小数点数)では % 記号が使えないといった、いくつかの注意点が存在します。

この記事では、C言語における剰余演算子 % の基本的な使い方から、負の数の計算ルール、実数で余りを求める fmod 関数の使い方まで、サンプルコード付きで詳しく解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はこじんまりとしたプログラミングスクールを運営
  • モットーは「利他の精神」

剰余演算子「%」の基本的な使い方

C言語で整数の余りを求めるには、剰余演算子 % (パーセント)を使用します。

数学では「mod(モジュロ)」と呼ばれることもありますが、C言語では算術演算子の一つとして定義されています。

整数同士の余りを求めるコード

使い方は非常にシンプルで、数値1 % 数値2 と記述することで、数値1を数値2で割った「余り」を取得できます。

#include <stdio.h>

int main(void) {
    int a = 10;
    int b = 3;
    int result;

    // 10 ÷ 3 の余りを計算
    result = a % b;

    printf("%d %% %d = %d\n", a, b, result);

    return 0;
}

実行結果

10 % 3 = 1

a % b の計算結果である 1 が変数 result に代入されます。

なお、printf 関数の中で % 記号そのものを表示したい場合は、%% と2つ続けて記述する必要があります。
これは printf の仕様上、% がフォーマット指定子として扱われるためです。

商と余りの関係

C言語の整数の割り算(/)と剰余(%)には、以下の数学的な関係が成り立ちます。

$$ a = (a / b) * b + (a % b) $$

つまり、「割られる数」は、「商 × 割る数 + 余り」と等しくなります。
データの整合性を確認する際などに役立つ知識ですので、覚えておくと良いでしょう。

負の数に対する剰余の扱い(注意点)

C言語で剰余計算を行う際、最も混乱しやすいのが「負の数」が含まれる場合です。

「-10 ÷ 3 の余りは?」と聞かれたとき、数学的な定義とプログラミング言語の挙動が異なることがあります。

C言語における負の剰余のルール

現在のC言語(C99規格以降)では、「余りの符号は、割られる数(左側の被除数)の符号と同じになる」 と定められています。

#include <stdio.h>

int main(void) {
    printf(" 10 %%  3 = %2d\n",  10 %  3);
    printf("-10 %%  3 = %2d\n", -10 %  3);
    printf(" 10 %% -3 = %2d\n",  10 % -3);
    printf("-10 %% -3 = %2d\n", -10 % -3);

    return 0;
}

実行結果

 10 %  3 =  1
-10 %  3 = -1
 10 % -3 =  1
-10 % -3 = -1

実行結果を見ると、割る数(右側)の符号に関わらず、割られる数(左側)がマイナスであれば、余りもマイナスになっていることがわかります。

例えば -10 % 3-1 となります。 数学的には余りを正の数(0, 1, 2…)として扱う場合も多いですが、C言語では負になる可能性がある点に注意が必要です。

もし常に正の余りが欲しい場合は、計算結果が負の場合に割る数を足すなどの補正処理が必要になります。

実数(double/float)の余りを求める「fmod関数」

ここまでは「整数」の話でしたが、小数を含む「実数(浮動小数点数)」の余りを求めたい場合はどうすれば良いでしょうか。

実は、% 演算子は整数型(int, longなど)にしか使えません。

実数に対して % を使うとコンパイルエラーになります。

math.hのfmod関数を使用する

実数の余りを求めるには、標準ライブラリ <math.h> に含まれる fmod 関数を使用します。

#include <stdio.h>
#include <math.h> // fmodを使うために必要

int main(void) {
    double x = 12.5;
    double y = 3.2;
    double result;

    // 12.5 ÷ 3.2 の余りを求める
    result = fmod(x, y);

    printf("%.1f %% %.1f = %f\n", x, y, result);

    return 0;
}

実行結果

12.5 % 3.2 = 2.900000

12.5 の中に 3.2 は3回入ります(3.2 × 3 = 9.6)。

残りの 12.5 - 9.6 である 2.9 が余りとして fmod 関数から返されます。

実数計算には誤差がつきものですが、fmod を使うことで浮動小数点数の剰余計算を安全に行うことができます。

剰余演算で発生するエラー(0除算)と対策

割り算と同様に、剰余演算においても 「0で割る(0による剰余)」は禁止 されています。
これを実行してしまうと、プログラムが異常終了したり、未定義動作を引き起こしたりします。

0除算を防ぐためのチェック

変数を扱う際は、割る数が0でないことを事前にチェックするのが鉄則です。

#include <stdio.h>

int main(void) {
    int a = 100;
    int b = 0; // ユーザー入力などで0になる可能性がある

    if (b == 0) {
        printf("エラー:0で割ることはできません。\n");
    } else {
        printf("余り: %d\n", a % b);
    }

    return 0;
}

if (b == 0) で事前に値を検査しています。

単純なミスに見えますが、ループ処理の中で分母が0になってしまうケースは非常に多いため、必ず条件分岐でガードするようにしましょう。

実務で役立つ!剰余演算の活用シーン

最後に、剰余演算が実際のプログラミングでどのように使われているのか、代表的な活用例を紹介します。

1. 偶数・奇数の判定

最もポピュラーな使い道です。2 で割った余りが 0 なら偶数、1 なら奇数と判定します。

if (num % 2 == 0) {
    printf("偶数です");
} else {
    printf("奇数です");
}

2. 配列のインデックスをループさせる(循環)

配列の要素を順番に処理し、最後まで行ったら最初に戻るような「循環処理」に使われます。

int array[] = {10, 20, 30};
int index = 0;

for (int i = 0; i < 10; i++) {
    // index を 0, 1, 2, 0, 1, 2... と循環させる
    printf("%d ", array[index % 3]);
    index++;
}

3. 時間の計算(秒数の変換)

秒数を「何分何秒」の形式に変換する際にも余りが活躍します。

int total_seconds = 150;
int minutes = total_seconds / 60; // 分(商)
int seconds = total_seconds % 60; // 秒(余り)

printf("%d秒 = %d分%d秒\n", total_seconds, minutes, seconds);

C言語のスキルを活かして年収を上げる方法

以上、C言語での剰余演算子「%」の使い方について解説してきました。

なお、C言語のスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

C言語を扱えるエンジニアは比較的希少価値が高く、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。

今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。

併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなC言語の案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。