C/C++のabs()・labs()・llabs()関数とは?絶対値を求める整数関数の使い方
Cライブラリにおける整数関数とは?
整数関数とは、引数として受け取った整数値に対して処理を行い、その結果を返す関数のことです。C言語では整数値のみがサポートされており、これらの関数は引数以下で最も近い整数値を返します。
整数関数には以下の3種類があります。
int = abs(int n); long = labs(long n); long long = llabs(long long n);
ここで n は整数値を表します。
abs()・labs()・llabs()関数の概要
これらの関数は、<cstdlib>ヘッダファイル(C標準ユーティリティライブラリ)で定義されています。いずれも引数として渡された整数値の絶対値を返す関数です。
abs()関数
abs()関数は、C言語では入力が「int」型であるのに対し、C++では「int」「long int」「long long int」のいずれかを受け付けます。C言語での出力は「int」型ですが、C++では出力は入力と同じデータ型になります。
abs()関数は、与えられた値の絶対値を評価します。つまり、数値から負および正の符号をすべて取り除いた値を返します。そのため、常に正の数を返すことになります。
例えば、
- abs(-43) は 43 を出力します。負の符号が取り除かれるためです。
- abs(12) は 12 を出力します。取り除くべき符号がないためです。
サンプルコード
#include <cstdlib>
#include <iostream>
using namespace std;
int main() {
int a = abs(123);
int b = abs(-986);
cout << "abs(123) = " << a << "\n";
cout << "abs(-986) = " << b << "\n";
return 0;
}
実行結果
abs(123) = 123 abs(-986) = 986
labs()関数
labs()関数は、入力と出力の両方が「long int」型であり、abs()関数のlong int版にあたります。
動作はabs()関数と同じく数値の負の符号を取り除きますが、違いはlong型の大きな値を扱える点です。
例えば、
- labs(245349384932L) = 245349384932
- labs(-34235668687987) = 34235668687987
サンプルコード
#include <cstdlib>
#include <iostream>
using namespace std;
int main() {
long int a = labs(437567342L);
long int b = labs(-8764523L);
cout << "labs(437567342L) = " << a << "\n";
cout << "labs(-8764523L) = " << b << "\n";
return 0;
}
実行結果
labs(437567342L) = 437567342 labs(-8764523L) = 8764523
llabs()関数
llabs()関数は、入力と出力の両方が「long long int」型であり、abs()関数のlong long int版です。64ビット整数の範囲まで対応できるため、非常に大きな数値の絶対値を求めたい場合に使用します。
サンプルコード
#include <cstdlib>
#include <iostream>
using namespace std;
int main() {
long long int a = llabs(9796546325253547656LL);
long long int b = llabs(-1423446557676111567LL);
cout << "llabs(9796546325253547656LL) = " << a << "\n";
cout << "llabs(-1423446557676111567LL) = " << b << "\n";
return 0;
}
実行結果
llabs(9796546325253547656LL) = 9796546325253547656 llabs(-1423446557676111567LL) = 1423446557676111567
まとめ
abs()・labs()・llabs()は、それぞれint型・long int型・long long int型の絶対値を求めるための関数です。扱う数値の大きさに応じて適切な関数を選択することで、オーバーフローを防ぎながら正確な計算結果を得ることができます。いずれも<cstdlib>ヘッダをインクルードして使用します。
-
C++で解く迷路問題:転がるボールが目的地に止まれるかをBFSで判定する方法
迷路の中にボールがあるとします。迷路には空きスペース(通路)と壁があります。ボールは上下左右のいずれかの方向に転がって空き通路を進むことができますが、壁にぶつかるまで止まりません。ボールが停止したときに、次の方向を選べます。この問題では、ボールの開始位置、目的地、そして迷路そのものが与えられ、「ボールが目的地の位置で停止できるかどうか」を判定する必要があります。迷路は2次元配列で表現され、1は壁、0は空きスペースを意味します。迷路の外周はすべて壁になっています。開始位置と目的地は行・列のインデックス(座標)で与えられます。問題例たとえば、次のような2次元配列で表される迷路を考えてみましょう。0
-
なぜC/C++では修飾子を使うのか?データ型修飾子の基礎をわかりやすく解説
修飾子(モディファイア)とは何か? 修飾子(modifier)とは、基本となるデータ型の意味を変更し、プログラムの要件に合わせてふるまいを調整するためのキーワードです。 たとえば「時間」を表す変数を考えてみましょう。時間がマイナスになることは論理的にあり得ないため、負の値を扱えない unsigned(符号なし)として宣言するのが自然です。このように、修飾子を使うことでメモリの使い方や表現できる値の範囲を、用途に応じて最適化できるのです。 C++で使える4つのデータ型修飾子 C++では、char、int、double といったデータ型の前に修飾子を付けることができます。主な修飾子は以下の4つで