BohYoh.comトップページへ  div
C言語 標準ライブラリ アルファベット順索引 ヘッダ別索引 ホームページへ C言語講座のページ

C89  C99  C11  整数算術関数
div
ヘッダ #include <stdlib.h>
形 式 div_t div(int numer, int denom);
機 能 本関数は、分子numerの分母denomによる除算の商quotと剰余remの両方を計算する。割り切れない場合の商は、代数的な商に最も近くそれより絶対値が小さい整数(代数的な商から小数部を切り捨てた値)である。
返却値 本関数は、商と剰余を含むdiv_t型の構造体を返す。この構造体は、次のメンバを含むが、その順序は任意である。
int quot; /* 商 */
int rem; /* 剰余 */

結果のいずれかが表現できない場合の動作は定義されない。そうでなけば、quotは代数的な商から小数部を切り捨てた値となり、quot * denom + remnumerに等しくなる。
補 足 C89では、オペランドの一方でも負である場合、整数を整数で割る除算の結果は処理系依存であった。具体的には、/演算子の結果として、『代数的な商以下の最大の整数』と『代数的な商以上の最小の整数』のいずれを採用するのかが処理系に委ねられていた。
具体例で考えよう。xが-22でyが5であるときの除算の結果は以下のようになり、いずれの結果となるかが処理系に依存するということである。
  • /演算子の結果は代数的な商以下の最大の整数 … x / y は -5で、x % y は 3
  • /演算子の結果は代数的な商以上の最小の整数 … x / y は -4で、x % y は -2
そのため、オペランドの一方でも負である場合、処理系に依存することのない除算の結果が必要な場合は、本関数を利用せざるを得なかった。たとえば、
int x = -22;
int y = 5;
div_t d = div(x, y);
と呼び出すと、d.quotは-4となり、d.remは-2となる。
なお、C99以降は、『0方向への切捨て』方式が採用され、/演算子の結果は、代数的な商から小数部を切り捨てた値となることが保証されるため、上記の例であれば、x / yは-4となり、x % yは-2となる。すなわち、div関数を呼び出す必要性はない。


BohYoh.comトップページへ