【2026年7月最新】C言語で絶対値を求める方法完全ガイド|abs・labs・fabs・fabsf関数の使い分けと実践コード例

【2026年7月最新】C言語で絶対値を求める方法完全ガイド|abs・labs・fabs・fabsf関数の使い分けと実践コード例

C言語で絶対値を求めたいとき、どの関数を使えばよいか迷ったことはありませんか?「abs関数があるのは知っているが、float型に使ったら正しく動かなかった」「math.hをインクルードしていないのにfabsを呼んでも動く気がする…」——こうした疑問は、C言語初学者だけでなく、中級者にとっても意外に多い落とし穴です。

C言語には絶対値を求める関数が複数存在します。それぞれがどのデータ型に対して動作するかを理解していないと、型の不一致による未定義動作や精度の欠損が起きます。「動いているように見えてバグが潜んでいる」状態が最も危険で、特に組み込み開発や数値計算では深刻な問題に発展することがあります。

この記事では、C言語の絶対値関数をデータ型ごとに体系的に解説します。abs・labs・llabs・fabs・fabsfの5関数の違いを完全に整理したうえで、if-else文やマクロによる自作実装まで網羅します。コード例はすべてコンパイルできる完全なサンプルです。

代表菅澤 代表菅澤
「absを使えば大丈夫」と思っていた方も多いと思いますが、実はint型にしか正確に動作しません。float型やlong long型には別の関数が必要です。この記事を読めば、型を見た瞬間に正しい関数が選べるようになります。
✔️abs・labs・llabs・fabs・fabsfそれぞれの正確な動作とデータ型対応
✔️stdlib.hとmath.hのインクルードが必要な場面の違い
✔️型ミスマッチによるバグが発生するメカニズムと回避方法
✔️if-else・三項演算子・マクロによる絶対値の自作実装パターン
✔️よくあるコンパイルエラーと警告の原因と修正方法
✔️データ型別の正しい関数選択フローチャート
AI鬼管理山崎 AI鬼管理山崎
「どの関数を使えば正解か」を毎回調べなくて済むように、この記事では判断フローを図解しています。一度読めば迷いがなくなります。
📌 この記事の結論
【2026年7月最新】C言語で絶対値を求める方法完全ガイド|abs・labs・fabs・fabsf関数の使い分けと実践コード例
C言語で絶対値を求めるabs・labs・fabs・fabsf関数の使い分けを完全解説。データ型ごとの正しい関数選択、stdlib.hとmath.hのインクルード方法、if-else・三項演算子による自作実装まで、コード例付きで徹底解説。

01 C言語における絶対値とは 数学的定義からプログラミングへの対応まで

絶対値(Absolute Value)とは、数値の「符号を取り除いた大きさ」を指します。数学では |x| という記法で表し、x が正の場合はそのまま x、負の場合は -x、0 の場合は 0 を返します。この概念はC言語でも同様ですが、プログラミングにおいてはデータ型に応じた専用の関数を使い分ける必要があります。

たとえば、数学では |−5.5| = 5.5 は自明ですが、C言語の abs(-5.5) は整数部しか処理できないため、内部で float が int に変換され 5 になってしまいます。これは「コンパイルエラーにはならないが、意図した結果にならない」典型的な罠です。

📚 用語解説

絶対値(Absolute Value):数直線上での原点(0)からの距離を表す値。正の数はそのまま、負の数は符号を反転させた値となる。数学記法では |x| で表され、常に0以上の値を返す。C言語では型に応じた専用関数(abs/labs/fabs等)を使って求める。

📚 用語解説

ヘッダファイル(Header File):C言語で標準ライブラリの関数を使用するために先頭で読み込む宣言ファイル。拡張子は .h。#include のように記述する。ヘッダファイルには関数のプロトタイプ宣言が含まれており、これを省略するとコンパイラが関数の型情報を知らないまま呼び出すことになり、未定義動作の原因となる。

C言語の絶対値関数は、使用するヘッダファイルとデータ型の対応関係を正確に把握することが重要です。以下のフロー図でまずは全体像を掴みましょう。

数値の型を確認
int型 → abs()
long型 → labs()
float/double型 → fabs()/fabsf()
AI鬼管理山崎 AI鬼管理山崎
「型を確認してから関数を選ぶ」という習慣をつけるだけで、絶対値関連のバグはほぼゼロにできます。最初は面倒でも、慣れると一瞬でわかるようになります。

また、C言語ではヘッダファイルのインクルード忘れがよくある問題です。整数向けのabs/labs/llabasは <stdlib.h> をインクルードして使います。浮動小数点向けのfabs/fabsfは <math.h> が必要です。この使い分けがミスの原因になりやすいため、本記事でしっかり解説します。

💡 C99以降のabs関数の動作

C99規格からは <stdlib.h> のabs関数がlong int引数に対してlabs相当の動作をする処理系もありますが、移植性のあるコードを書くためには常に型に合った専用関数を明示的に使うことを推奨します。コンパイラや環境依存に頼るのは避けましょう。

絶対値の計算が必要なユースケースは非常に多くあります。たとえば、2点間の距離計算、誤差の評価、データの正規化、グラフィックスでの座標計算、音声信号処理など、科学技術計算から組み込み系まで幅広い場面で登場します。そのため、正確な関数選択は実務上の重要スキルです。

02 abs関数の使い方(int型) stdlib.hをインクルードしてint型の絶対値を取得する

abs関数はC言語で最もよく使われる絶対値関数です。int型(整数型)の絶対値を求めるために設計されており、<stdlib.h> をインクルードすることで使えます。関数のシグネチャは int abs(int x); です。引数も戻り値も int 型であることに注意してください。

📚 用語解説

stdlib.h:Standard Library の略。C言語の標準ライブラリヘッダの一つで、メモリ管理(malloc/free)、文字列変換(atoi/strtol)、乱数(rand)、プロセス制御(exit)、絶対値(abs/labs/llabs)などの汎用ユーティリティ関数が宣言されている。ほぼすべてのC言語プログラムで使用される基本ヘッダ。

📚 用語解説

int型:C言語の基本整数型。多くの環境では32ビット符号付き整数で、格納できる範囲は -2,147,483,648 〜 2,147,483,647。abs()関数はこの範囲の整数の絶対値を正確に求める。ただし INT_MIN(-2147483648)の絶対値は同型で表現できないため、この値をabs()に渡すと未定義動作になる点に注意が必要。

以下は abs 関数の基本的な使い方を示す完全なサンプルプログラムです。

#include <stdio.h>
#include <stdlib.h>  /* abs() を使うために必要 */

int main(void) {
    int a = -42;
    int b = 100;
    int c = 0;

    printf("abs(%d) = %d\n", a, abs(a));   /* abs(-42) = 42 */
    printf("abs(%d) = %d\n", b, abs(b));   /* abs(100) = 100 */
    printf("abs(%d) = %d\n", c, abs(c));   /* abs(0) = 0 */

    /* 差分の絶対値を求める例(距離計算) */
    int x1 = 5, x2 = -3;
    int distance = abs(x1 - x2);
    printf("x1=%d と x2=%d の距離: %d\n", x1, x2, distance); /* 8 */

    return 0;
}

このプログラムをコンパイルして実行すると、以下の出力が得られます。

abs(-42) = 42
abs(100) = 100
abs(0) = 0
x1=5 と x2=-3 の距離: 8
代表菅澤 代表菅澤
abs関数は非常にシンプルですが、「stdlib.hのインクルードを忘れる」「float型の値を渡してしまう」という2つのミスが頻発します。コードレビューでも頻繁に指摘されるポイントです。
⚠️ int型以外にabs()を使うと精度が失われる

abs(-3.14) のようにfloat/double型の値をabs()に渡すと、暗黙の型変換によってfloatの小数部が切り捨てられてintになってから処理されます。abs(-3.14)は3を返し、小数点以下の情報が完全に失われます。コンパイル時に警告が出る場合もありますが、警告なしで通るケースもあるため注意が必要です。float/doubleにはfabs()/fabsf()を使いましょう。

abs関数を実際の計算に使う場面をいくつか確認しましょう。数値の差の絶対値を使った誤差チェック、配列要素の正規化など、実務で頻繁に使うパターンです。

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    /* 誤差チェック: 期待値と実測値の差が許容範囲内かどうか */
    int expected = 100;
    int actual   = 97;
    int tolerance = 5;

    if (abs(expected - actual) <= tolerance) {
        printf("許容範囲内: 差=%d\n", abs(expected - actual));
    } else {
        printf("許容範囲外: 差=%d\n", abs(expected - actual));
    }

    /* 配列の各要素の絶対値を求める */
    int arr[] = {-10, 3, -7, 0, 15, -2};
    int n = sizeof(arr) / sizeof(arr[0]);

    printf("絶対値の配列: ");
    for (int i = 0; i < n; i++) {
        printf("%d ", abs(arr[i]));
    }
    printf("\n");

    return 0;
}
💡 abs関数の戻り値はint型

abs()の戻り値はint型です。long型やlong long型の値を扱いたい場合は戻り値の型も一致していないと、大きな数値で正しく動作しません。int型の最大値(2147483647)を超える数を扱う場合は後述のlabs()/llabs()を使いましょう。

AI鬼管理山崎 AI鬼管理山崎
absはシンプルな分、使用頻度が高いからこそ油断しがちです。「int型専用」と強く意識するだけで多くのバグを防げます。型のサイズに応じた関数選択が正しいC言語の書き方です。

03 labs・llabs関数(long/long long型) 大きな整数値の絶対値を正確に求める方法

int型の範囲(約±21億)を超える整数値を扱う場合は、labs(long型用)またはllabs(long long型用)を使う必要があります。どちらも <stdlib.h> に含まれており、abs と同様にインクルードするだけで使用できます。

📚 用語解説

long型:C言語の拡張整数型。32ビット環境では int と同じ32ビット幅のこともあるが、64ビット Linux/macOS環境ではlong型は64ビット(-9,223,372,036,854,775,808 〜 9,223,372,036,854,775,807)となる。Windowsの64ビット環境ではlong型は32ビットのまま。この環境依存性のため、大きな整数にはlong longを使うことが推奨される。labs()はこのlong型の絶対値を返す関数。

以下にlabs・llaabs両関数の実践的なサンプルを示します。

#include <stdio.h>
#include <stdlib.h>  /* labs(), llabs() を使うために必要 */

int main(void) {
    long a = -1234567890L;
    long b = 9876543210L;

    printf("labs(%ld) = %ld\n", a, labs(a));   /* 1234567890 */
    printf("labs(%ld) = %ld\n", b, labs(b));   /* 9876543210 */

    long long c = -9876543210123LL;
    long long d = 1000000000000LL;

    printf("llabs(%lld) = %lld\n", c, llabs(c)); /* 9876543210123 */
    printf("llabs(%lld) = %lld\n", d, llabs(d)); /* 1000000000000 */

    /* long long型での差分絶対値計算(大きなファイルサイズ比較等に有用) */
    long long file1_size = 5368709120LL;   /* 5GB */
    long long file2_size = 3221225472LL;   /* 3GB */
    long long diff = llabs(file1_size - file2_size);
    printf("ファイルサイズ差: %lld バイト\n", diff);  /* 2147483648 */

    return 0;
}
代表菅澤 代表菅澤
ファイルサイズ、ネットワーク転送量、タイムスタンプの差分など、現代のシステム開発ではlong long型が必須の場面が多くなっています。「intで足りるだろう」という先入観が後で大きな問題になることがあります。

labs とllabs の使い分けは、変数の型に完全に一致させることが重要です。型が一致していないと、暗黙の型変換が行われて計算精度が失われる可能性があります。以下のフロー図で整数型の関数選択を整理しましょう。

int型の値
abs() を使用
→ long型の値
labs() を使用
→ long long型の値
llabs() を使用
⚠️ longのサイズは環境依存

long型のビット幅は処理系・プラットフォームによって異なります。Windowsの64ビット環境ではlong型は32ビット(intと同じ幅)ですが、64ビットのLinux・macOS環境では64ビットです。この違いを無視すると、long型に大きな値を代入したつもりがオーバーフローする可能性があります。移植性を重視するコードでは、<stdint.h>のint32_t・int64_tを使い、対応するabs関数はimaxabs(<inttypes.h>)を検討してください。

04 fabs・fabsf関数(double/float型) 浮動小数点数の絶対値はmath.hの関数を使う

浮動小数点数(小数を含む実数)の絶対値を求める際は、fabs(double型用)またはfabsf(float型用)を使います。これらは <math.h> に宣言されており、コンパイル時には -lm オプションでの数学ライブラリのリンクが必要な環境があります。

📚 用語解説

double型:C言語の倍精度浮動小数点型。IEEE 754規格に基づく64ビットの浮動小数点数。精度は約15〜16桁の有効数字。C言語において浮動小数点リテラルのデフォルト型はdoubleであり、3.14や2.71828などは自動的にdouble型として扱われる。科学技術計算、金融計算など高精度が必要な場面で使用される。fabs()はdouble型の絶対値を返す関数。

📚 用語解説

float型:C言語の単精度浮動小数点型。IEEE 754規格に基づく32ビットの浮動小数点数。精度は約6〜7桁の有効数字。doubleより精度は低いが、メモリ使用量が半分で処理が高速なため、組み込みシステムやグラフィックス処理(3D計算等)では多用される。float型リテラルを示すには 3.14f のように末尾にfをつける。fabsf()はfloat型の絶対値を返す関数。

📚 用語解説

math.h:C言語の数学ライブラリヘッダ。sin/cos/tan(三角関数)、sqrt(平方根)、pow(べき乗)、log(対数)、fabs/fabsf(絶対値)など、数学的な計算関数が宣言されている。#include <math.h>でインクルードして使う。GCC等の環境ではコンパイル時に-lmオプションを追加して数学ライブラリをリンクする必要がある場合がある。

以下のサンプルでは fabs と fabsf の両方を実際に使い、double型とfloat型それぞれで絶対値を計算する方法を示します。

#include <stdio.h>
#include <math.h>   /* fabs(), fabsf() を使うために必要 */

int main(void) {
    /* double型の絶対値: fabs() */
    double d1 = -3.141592653589793;
    double d2 = 2.718281828459045;
    double d3 = -0.0;

    printf("fabs(%f) = %f\n", d1, fabs(d1));  /* 3.141593 */
    printf("fabs(%f) = %f\n", d2, fabs(d2));  /* 2.718282 */
    printf("fabs(%f) = %f\n", d3, fabs(d3));  /* 0.000000 */

    /* float型の絶対値: fabsf() */
    float f1 = -1.5f;
    float f2 = 0.001f;
    float f3 = -100.0f;

    printf("fabsf(%f) = %f\n", f1, fabsf(f1));  /* 1.500000 */
    printf("fabsf(%f) = %f\n", f2, fabsf(f2));  /* 0.001000 */
    printf("fabsf(%f) = %f\n", f3, fabsf(f3));  /* 100.000000 */

    /* 誤差の絶対値チェック(数値計算での典型的な使用例) */
    double expected = 1.0 / 3.0;
    double computed = 0.333333;
    double error = fabs(expected - computed);
    printf("誤差の絶対値: %e\n", error);

    return 0;
}
AI鬼管理山崎 AI鬼管理山崎
double型を使う場合はfabs()、float型を使う場合はfabsf()を使うのが基本ルールです。double型の値にfabsf()を使うと精度が落ちる場合があるので注意してください。
⚠️ -lm オプションを忘れるとリンクエラーになる

GCC(Linux/macOS環境)では、math.hの関数を使うためにコンパイル時に -lm オプションを追加する必要があります。gcc myprogram.c -o myprogram -lm のように記述します。このオプションを忘れると「undefined reference to `fabs'」のようなリンクエラーが発生します。一方、Windowsの多くの開発環境(MinGW, Visual Studio等)では -lm が不要な場合もあります。

💡 C99以降のtgmath.hを使う方法

C99規格以降では <tgmath.h>(type-generic math)をインクルードすることで、引数の型に応じてfabs/fabsf/fabslを自動選択するマクロとして abs/fabs を使えます。移植性の高いコードを書く場合、C99以降の環境限定ならtgmath.hも選択肢になります。ただしC++ではオーバーロードが使えるため、std::absだけで全型に対応できます。

代表菅澤 代表菅澤
組み込み系の現場でよく見る間違いは、double型変数にfabsf()を使うことです。float型は32ビットなのでdoubleの精度(64ビット)が失われます。特にセンサーデータの処理では精度の違いが制御品質に直結するので要注意です。

05 データ型別の関数選択ガイド 型を見た瞬間に正しい関数が選べるようになる

C言語の絶対値関数は5種類(abs・labs・llabs・fabs・fabsf)あり、それぞれが特定のデータ型に対して最適化されています。以下の意思決定フローを参考に、コード中の変数の型に応じた正しい関数を選んでください。

変数の型を確認
int → abs()
long → labs()
long long → llabs()
double → fabs()
float → fabsf()

より詳細な情報を以下の比較表にまとめました。ヘッダファイル、引数型、戻り値型、コンパイルオプションの4点を一覧できます。

関数名 対象型 引数型 戻り値型 ヘッダ コンパイルオプション
abs() int型整数 int int <stdlib.h> 不要
labs() long型整数 long long <stdlib.h> 不要
llabs() long long型整数 long long long long <stdlib.h> 不要(C99以降)
fabs() double型実数 double double <math.h> -lm(環境依存)
fabsf() float型実数 float float <math.h> -lm(環境依存)
✔️abs():int型のみ。stdlib.hをインクルード。最も使用頻度が高い
✔️labs():long型専用。stdlib.hをインクルード。環境によりintと同サイズのことも
✔️llabs():long long型専用。stdlib.hをインクルード。C99以降で利用可能
✔️fabs():double型専用。math.hをインクルード。Linuxでは-lmが必要なことも
✔️fabsf():float型専用。math.hをインクルード。組み込み系でよく使う
AI鬼管理山崎 AI鬼管理山崎
この表を見ながら「自分が今操作している変数の型は何か?」と確認する癖をつけてください。型が見えていれば正しい関数を選ぶのは難しくありません。
💡 C11以降の_Generic構文による汎用化

C11規格以降では _Generic 構文を使って型に応じた関数を自動選択するマクロを自作できます。たとえば #define ABS(x) _Generic((x), int: abs, long: labs, long long: llabs, float: fabsf, double: fabs)(x) のように定義すると、型に関わらず ABS(x) で呼び出せます。ただし可読性が下がるため、チームの方針に合わせて判断してください。

06 if-else・三項演算子で自作する方法 標準関数を使わずに絶対値を実装するパターン集

標準ライブラリの絶対値関数を使わず、自前で実装するパターンを学ぶことは、C言語の制御構文を深く理解するうえで非常に有益です。また、組み込み開発など標準ライブラリが使えない環境や、インライン展開による最適化が必要な場面でも役立ちます。ここでは3種類の実装方法を紹介します。

パターン1:if-else文による実装が最もわかりやすい基本実装です。条件分岐を明示的に書くため、コードの意図がはっきり伝わります。

#include <stdio.h>

/* if-else で絶対値を求める関数 */
int my_abs_int(int x) {
    if (x < 0) {
        return -x;
    } else {
        return x;
    }
}

double my_abs_double(double x) {
    if (x < 0.0) {
        return -x;
    } else {
        return x;
    }
}

int main(void) {
    printf("my_abs_int(-7)    = %d\n",  my_abs_int(-7));     /* 7 */
    printf("my_abs_int(3)     = %d\n",  my_abs_int(3));      /* 3 */
    printf("my_abs_double(-2.5) = %f\n", my_abs_double(-2.5)); /* 2.5 */
    return 0;
}

パターン2:三項演算子(条件演算子)による実装です。if-elseをより簡潔に1行で書けます。数式のように読めるため、慣れた開発者には好まれる書き方です。

#include <stdio.h>

/* 三項演算子で絶対値を求める */
int my_abs_ternary(int x) {
    return (x < 0) ? -x : x;
}

double my_fabs_ternary(double x) {
    return (x < 0.0) ? -x : x;
}

int main(void) {
    int values[] = {-5, 0, 3, -100, 42};
    int n = sizeof(values) / sizeof(values[0]);

    printf("三項演算子による絶対値:\n");
    for (int i = 0; i < n; i++) {
        printf("  %4d -> %4d\n", values[i], my_abs_ternary(values[i]));
    }

    printf("double版: %.3f\n", my_fabs_ternary(-3.14));  /* 3.140 */
    return 0;
}

パターン3:マクロ(#define)による実装です。関数呼び出しのオーバーヘッドがなく、型に依存しない汎用性があります。ただし副作用のある式を渡すと問題が起きるため、使い方には注意が必要です。

#include <stdio.h>

/* マクロによる絶対値の定義 */
#define MY_ABS(x)  ((x) < 0 ? -(x) : (x))

int main(void) {
    int   i = -10;
    float f = -3.14f;
    double d = -2.718;

    /* どの型でも使用可能(型変換は呼び出し側の責任) */
    printf("MY_ABS(%d)   = %d\n",   i, MY_ABS(i));   /* 10 */
    printf("MY_ABS(%f)  = %f\n",   f, MY_ABS(f));   /* 3.140000 */
    printf("MY_ABS(%lf) = %lf\n",  d, MY_ABS(d));   /* 2.718000 */

    return 0;
}
代表菅澤 代表菅澤
三項演算子版は簡潔でよいのですが、マクロは「副作用のある式」を渡したときに意図しない動作になります。MY_ABS(i++) のように渡すと i の更新が2回実行されるバグが生じます。マクロはシンプルな変数や定数にだけ使うと安全です。
⚠️ マクロに副作用のある式を渡してはいけない

MY_ABS(i++) のようにインクリメント演算子を含む式を渡すと、マクロ展開後に ((i++) < 0 ? -(i++) : (i++)) になります。i の評価が2回行われるため、意図しない結果になります。この問題を避けるには、マクロに渡す前に変数に一度代入するか、インライン関数(C99以降)を使いましょう。static inline int my_abs(int x) { return x < 0 ? -x : x; } のようにすれば副作用の問題を回避できます。

💡 インライン関数が最もバランスが良い

C99以降では static inline キーワードを使ったインライン関数を定義できます。マクロと同様に関数呼び出しのオーバーヘッドを抑えつつ、型安全性と副作用の問題を解決できます。組み込み系での自作実装においては、マクロよりもインライン関数のほうが安全で推奨されます。

AI鬼管理山崎 AI鬼管理山崎
自作実装はC言語の仕組みを深く理解するための良い練習になります。ただし実際のプロジェクトでは、標準ライブラリの関数を使うほうがバグが少なく、可読性も高くなります。標準関数がある場面では素直に使いましょう。

07 よくある間違いとエラー 型ミスマッチ・ヘッダ忘れ・未定義動作の回避法

C言語の絶対値関数に関連してよく見られる間違いとエラーをまとめます。コンパイルエラーになるケースも、警告なしにバグが生じるケースも、どちらも重要です。

⚠️ 間違い①:float/doubleにabs()を使う

abs(-3.14) のようにfloat/double値をabs()に渡すと、暗黙型変換でintになり小数部が失われます。コンパイラによっては警告を出しますが、エラーにはなりません。-3.14の絶対値として3が返るため、計算上の誤差が発生します。正解:fabs(-3.14) または fabsf(-3.14f) を使う。

⚠️ 間違い②:math.hをインクルードせずにfabs()を使う

math.hをインクルードせずにfabs()を呼び出すと、コンパイラによっては「暗黙の関数宣言」として扱われ、戻り値がint型と解釈されます。結果として浮動小数点数を正しく扱えず、誤った値が返ることがあります。C99以降では暗黙の関数宣言はコンパイルエラーになる場合もあります。正解:必ず #include を記述する。

以下のコードで「間違った実装」と「正しい実装」を比較してみましょう。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int main(void) {
    double x = -3.14;
    float  y = -2.5f;

    /* 間違い: abs()をfloat/doubleに使う */
    /* int result_wrong = abs(x); */   /* 3 になってしまう(小数部損失) */

    /* 正しい: 型に合った関数を使う */
    double result_d = fabs(x);   /* 3.14 */
    float  result_f = fabsf(y);  /* 2.5 */

    printf("fabs(%f)  = %f\n", x, result_d);  /* 3.140000 */
    printf("fabsf(%f) = %f\n", y, result_f);  /* 2.500000 */

    /* 間違い: labs()にint値を渡す(型の不一致、警告が出る場合も) */
    int a = -100;
    /* long result_wrong2 = labs(a); */ /* 動くが暗黙変換あり */

    /* 正しい: intにはabs()を使う */
    int result_i = abs(a);   /* 100 */
    printf("abs(%d) = %d\n", a, result_i);

    return 0;
}
代表菅澤 代表菅澤
「コンパイルが通った」「実行時にクラッシュしない」=「正しい」ではありません。型ミスマッチのバグは、特定の条件でしか顕在化しないことがあり、デバッグが非常に困難です。コーディング時点で型を意識することが最大の防衛策です。
✔️abs()はint型専用:float/doubleに使うと小数部が失われる
✔️fabs()はdouble型専用:float型にはfabsf()を使う
✔️math.hのインクルード忘れ:fabs/fabsf使用時は必須
✔️-lmオプション:GCC(Linux)ではコンパイル時に忘れずに追加
✔️INT_MINのabs():-2147483648をabs()に渡すと未定義動作になる
✔️マクロへの副作用式の渡し:MY_ABS(i++)のように書かない

08 よくある質問 C言語の絶対値についてよく寄せられる疑問に答える

C言語の絶対値関数についてよく寄せられる質問をまとめます。

Q1. abs()とfabs()の違いは何ですか?

A. 扱うデータ型が異なります。abs()はint型(整数)用、fabs()はdouble型(浮動小数点数)用の絶対値関数です。abs()に浮動小数点数を渡すと小数部が切り捨てられてしまいます。使用するヘッダファイルも異なり、abs()は<stdlib.h>、fabs()は<math.h>です。変数の型を確認して正しい関数を選ぶことが重要です。

Q2. fabsとfabsfのどちらを使えばよいですか?

A. 変数の型に合わせて選びます。double型の変数にはfabs()、float型の変数にはfabsf()を使います。float型の変数にfabs()を使うと、引数がdoubleに昇格して計算され、その後floatに戻されるため、処理は正しく行われますが、型変換のオーバーヘッドが発生します。厳密なfloat型の計算が必要な組み込み環境ではfabsf()を明示的に使うことを推奨します。

Q3. math.hをインクルードしなくてもfabsが動くことがありますが、なぜですか?

A. コンパイラや環境によっては、他のヘッダファイルが間接的にmath.hの内容を取り込むことがあります。また、古いC規格(C89以前)では暗黙の関数宣言が許可されていたため、インクルードなしで動いてしまうケースがありました。しかしこれは移植性のない偶然の動作です。C99以降では暗黙の宣言はエラーまたは警告になります。必ず明示的に#include <math.h>を記述してください。

Q4. C++でC言語の絶対値関数を使えますか?

A. C++では<cstdlib><cmath>をインクルードすることで同様の関数が使えます。さらにC++ではstd::absがオーバーロードされており、int/long/long long/float/double/long doubleのすべてに対して正しく動作します。C++を使う場合は#include <cmath>std::abs(x)を使うと型に応じて自動選択されるため便利です。C言語での明示的な型別関数選択は不要になります。

Q5. -lmオプションとは何ですか?どんな環境で必要ですか?

A. -lmはGCCでコンパイルする際に数学ライブラリ(libm)をリンクするオプションです。LinuxやmacOS上でGCCを使ってfabs()などのmath.h関数を含むプログラムをコンパイルするときに必要です(例:gcc myfile.c -o myfile -lm)。一方、Windows上のMinGWやVisual Studioではlibmがデフォルトでリンクされるため、-lmオプションが不要なことがほとんどです。「undefined reference to `fabs'」というエラーが出たら、-lmの追加で解決します。

AI鬼管理山崎 AI鬼管理山崎
FAQをひと通り読んで「わかった」と思っても、実際に自分でコードを書いて動かしてみることが理解の定着に不可欠です。この記事のサンプルコードをコピーして実行してみてください。

09 まとめ — C言語の絶対値関数を完全マスター 型を見て即座に正しい関数を選べるようになろう

この記事では、C言語で絶対値を求めるための全関数を徹底解説しました。abs・labs・llabs・fabs・fabsfの5関数は、それぞれ扱うデータ型が異なります。型に合った関数を使うことがバグのないC言語プログラムを書くための基本です。

✔️abs():int型専用。stdlib.hをインクルード。最も基本的な絶対値関数
✔️labs():long型専用。stdlib.hをインクルード。環境によりintと同サイズのことも
✔️llabs():long long型専用。stdlib.hをインクルード。C99以降で利用可能
✔️fabs():double型専用。math.hをインクルード。小数の絶対値の標準関数
✔️fabsf():float型専用。math.hをインクルード。組み込み系で多用される
✔️自作実装:if-else・三項演算子・インライン関数・マクロの4パターンを理解
✔️よくあるミス:型ミスマッチ、ヘッダインクルード忘れ、-lmオプション忘れ
代表菅澤 代表菅澤
C言語の絶対値関数は単純に見えますが、型の概念が根底にあります。「型を意識してコードを書く」という習慣がついていれば、絶対値に限らずC言語全般のバグを大幅に減らせます。この記事が型への意識を高めるきっかけになれば幸いです。

C言語を含むプログラミングのスキルを業務効率化につなげたい方、AIを活用して開発生産性を上げたい方は、AI鬼管理の無料相談をお気軽にご利用ください。

NEXT STEP

この記事の内容を、あなたのビジネスで
実践してみませんか?

AI活用を自社で回せるようになりたい方へ

AI鬼管理

Claude Code・Cowork導入支援から業務設計・社内浸透まで実践ベースで伴走。「自社で回せる組織」を90日で作る経営者向けトレーニング。

AIAI鬼管理

AI鬼管理へのお問い合わせ

この記事を読んで気になった方へ。
AI鬼管理の専門スタッフが、御社に最適な
業務自動化プランを無料でご提案します。

会社名を入力してください
業種を選択してください
お名前を入力してください
正しいメールアドレスを入力してください

1つ以上選択してください
1つ以上選択してください
月額コストを選択してください

約1時間のオンライン面談(Google Meet)です

空き枠を取得中...
面談日時を選択してください

予約確定後、Google Calendarの招待メールをお届けします。
しつこい営業は一切ございません。

監修 最終更新日: 2026年7月19日
菅澤孝平
菅澤 孝平 株式会社GENAI 代表取締役
  • AI業務自動化サービス「AI鬼管理」を運営 — Claude Code を活用し、経営者の業務を「AIエージェントに任せる仕組み」へ転換するパーソナルトレーニングを 伴走構築 で提供。日報・採用・問い合わせ対応・経費精算・議事録・データ集計・営業リスト等の定型業務を、AIに代行させる体制を経営者と一緒に作り込む
  • Claude Code 実装ノウハウを 経営者・法人クライアント に直接指導。生成AIを「便利ツール」ではなく 「業務を任せる存在」 として運用する手法を体系化
  • 「やらせ切る管理」メソッドの開発者。シンゲキ株式会社(2021年設立・鬼管理専門塾運営)にて累計3,000名以上の学習者を志望校合格に導いた管理メソッドを、AI × 経営者支援 に転用
  • 著書『3カ月で志望大学に合格できる鬼管理』(幻冬舎)、『親の過干渉こそ、最強の大学受験対策である。』(講談社)
  • メディア出演: REAL VALUE / カンニング竹山のイチバン研究所 / ええじゃないかBiz 他
  • 明治大学政治経済学部卒
現在は AI鬼管理(Claude Code活用の伴走型パーソナルトレーニング)を主事業とし、経営者と二人三脚で「AIに業務を任せる仕組み」を実装。「実行を強制する環境」を AI で構築する手法を、自社の実運用知見をもとに発信している。