【C/C++】abs・labs・llabs関数の使い方と違いを徹底解説
C++のcstdlibライブラリ(C言語ではstdlib.h)には、絶対値を求めるための関数が複数用意されています。abs()は主にint型の入力に使用され、C++ではint型・long型・long long型にも対応したオーバーロードが提供されています。一方、labs()やllabs()は、それぞれlong型やlong long型などのより大きな整数データを扱うために用意された関数です。
この記事では、これら3つの絶対値関数の使い方と違いを、サンプルコードと実行結果付きでわかりやすく解説します。
abs() 関数
abs()関数は、int型のデータに対して使用します。引数として渡した値の絶対値を戻り値として返します。構文は以下の通りです。
int abs(int argument)
サンプルコード
#include <cstdlib>
#include <iomanip>
#include <iostream>
using namespace std;
main() {
int x = -145;
int y = 145;
cout << "Absolute value of " << x << " is: " << abs(x) << endl;
cout << "Absolute value of " << y << " is: " << abs(y) << endl;
}実行結果
Absolute value of -145 is: 145 Absolute value of 145 is: 145
負の値「-145」を渡すと「145」が返り、正の値「145」を渡してもそのまま「145」が返ることが確認できます。
labs() 関数
labs()関数は、long型のデータに対して使用します。int型の範囲を超える大きな整数値の絶対値を求めたい場合に活用します。構文は以下の通りです。
long labs(long argument)
サンプルコード
#include <cstdlib>
#include <iomanip>
#include <iostream>
using namespace std;
main() {
long x = -9256847L;
long y = 9256847L;
cout << "Absolute value of " << x << " is: " << labs(x) << endl;
cout << "Absolute value of " << y << " is: " << labs(y) << endl;
}実行結果
Absolute value of -9256847 is: 9256847 Absolute value of 9256847 is: 9256847
long型のリテラルであることを示す接尾辞「L」を付けて値を定義し、labs()に渡しています。負の値も正しく絶対値に変換されています。
llabs() 関数
llabs()関数は、long long型のデータに対して使用します。long型よりもさらに大きな範囲の整数値を扱えるため、非常に大きい数値の絶対値を求める際に使用します。構文は以下の通りです。
long long llabs(long long argument)
サンプルコード
#include <cstdlib>
#include <iomanip>
#include <iostream>
using namespace std;
main() {
long long x = -99887654321LL;
long long y = 99887654321LL;
cout << "Absolute value of " << x << " is: " << llabs(x) << endl;
cout << "Absolute value of " << y << " is: " << llabs(y) << endl;
}実行結果
Absolute value of -99887654321 is: 99887654321 Absolute value of 99887654321 is: 99887654321
long long型のリテラルであることを示す接尾辞「LL」を使用し、11桁の大きな数値でも正しく絶対値が計算されています。
まとめ:3つの関数の使い分け
| 関数名 | 対応するデータ型 |
|---|---|
| abs() | int型 |
| labs() | long型 |
| llabs() | long long型 |
扱いたい数値のサイズに応じて、適切な関数を選択することが重要です。なお、C++では関数オーバーロードの仕組みにより、<cmath>をインクルードすればabs()がfloat型やdouble型にも対応します。また、int型の最小値(例えば32bit環境での-2147483648)のような極端な負の値は、同じ幅の正の数として表現できないため注意が必要です。
-
C/C++における配列の関数への渡し方を解説
このチュートリアルでは、配列が関数へどのように渡されるのかについて詳しく解説します。 C/C++において、配列を関数に渡す際には、配列そのものがコピーされるのではなく、ポインタとして渡されます。つまり、配列の先頭要素のアドレスが関数に引き渡されることになります。そのため、関数の内部で sizeof 演算子を使って配列のサイズを求めると、元の配列全体のサイズではなく、ポインタ自体のサイズが返される点に注意が必要です。 サンプルコード #include <stdio.h> // 配列をポインタとして渡す void fun(int arr[]){ unsigne
-
C/C++で学ぶAA木(AA Tree)とは?基本概念と平衡化操作を徹底解説
AA木(AA Tree)とはコンピュータサイエンスにおいて、AA木(AA Tree)とは、順序付きデータを効率的に格納・検索するために実装された平衡木(バランスドツリー)の一種です。AA木は、赤黒木(Red-Black Tree)の変種として扱われます。赤黒木は二分探索木の一形態であり、要素の追加や削除を効率的にサポートします。赤黒木と大きく異なる点は、AA木では赤いノードを右の子としてのみ追加でき、左の子としては配置できないという制約があることです。この制約により、2-3-4木ではなく2-3木をシミュレートすることになり、その結果、木の保守操作が大幅に簡素化されます。赤黒木の平衡化アルゴリズ