C に/
2 つの数値を除算する演算子がある場合、div()
ライブラリ関数を使用する目的は何ですか?
/
使用できないが使用できるシナリオはありますdiv()
か?
C に/
2 つの数値を除算する演算子がある場合、div()
ライブラリ関数を使用する目的は何ですか?
/
使用できないが使用できるシナリオはありますdiv()
か?
C99 Rationale ドキュメントから:
(7.20.6.2 div、ldiv、および lldiv 関数) C89 には、負のオペランドが含まれる場合の符号付き整数の除算の実装定義のセマンティクスがあったため、C99 の div と ldiv、および lldiv は、signed に対して明確に指定されたセマンティクスを提供するために考案されました。整数除算と剰余演算。セマンティクスは Fortran と同じになるように採用されました。これらの関数は商と剰余の両方を返すため、両方の結果を同じ演算の一部として計算する基礎となるハードウェアを効率的にモデル化する便利な方法としても機能します。[...] C99 は除算演算子に同様のセマンティクスを必要とするため、新しいプログラムで div、ldiv、または lldiv を使用する主な理由は、商と剰余を同時に取得することです。
div_t
は、商メンバーと剰余メンバーを含む構造体です。例えば :
typedef struct {
int quot;
int rem;
} div_t;
div
関数の使用/
と%
演算子のいくつかの簡単な実装。このトピックも表示されます。
div()
result
は除算のとを返しますremainder
。%
したがって、を見つけるために演算子を使用する必要はありませんremainder
。
他の人が述べたようにdiv()
、商と剰余の両方が得られます。これは、ほとんどの C ランタイムが使用する (ソフトウェア) 整数除算アルゴリズムが両方を同時に計算するためです。
ターゲット コンピューターにハードウェア ディバイダーがない場合、/
通常、オペレーターは への呼び出しにdiv()
なり、残りは破棄されます。%
投げられるのは商であることを除いて、演算子でも同じことが起こります。したがって、次のようなことをしている場合:
quot = a / b;
rem = a % b;
除算ルーチンを 2 回呼び出しています (コンピュータがハードウェアで除算を行わない場合、除算はかなり遅くなります)。したがって、
div()
両方を取得するために使用する方が高速です。
(もちろん、読みにくく、実際にパフォーマンス上の利点が得られるかどうかは、特定のプラットフォームとコンパイラによって異なりますdiv()
。パフォーマンスのボトルネックであると判断した場合にのみ、に切り替える必要があります。時期尚早の最適化について Knuth が言ったことを思い出してください。)