名前空間
変種
操作

div, ldiv, lldiv, imaxdiv

From cppreference.com
< c‎ | numeric‎ | math
 
 
 
共通の数学関数
関数
基本的な数学関数
divldivlldivimaxdiv
(C99)(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小演算
(C99)
(C99)
指数関数
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
べき乗関数
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
三角関数と双曲線関数
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
最も近い整数浮動小数点数
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮動小数点操作
(C99)(C99)
(C99)(C23)
(C99)
縮小演算
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子および量子指数
Decimal再エンコーディング関数
総順序およびペイロード関数
分類
(C99)
(C99)
(C99)
(C23)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
div_tldiv_tlldiv_timaxdiv_t
(C99)(C99)
マクロ定数
特殊な浮動小数点値
(C99)(C23)
引数と戻り値
エラーハンドリング
高速演算インジケータ
 
ヘッダー <stdlib.h> で定義
div_t     div( int x, int y );
(1)
ldiv_t    ldiv( long x, long y );
(2)
lldiv_t   lldiv( long long x, long long y );
(3) (C99以降)
ヘッダ <inttypes.h> で定義
imaxdiv_t imaxdiv( intmax_t x, intmax_t y );
(4) (C99以降)

被除数xを被除数yで割った商と剰余を両方計算します。

商と剰余を同時に計算します。商は、小数部分を切り捨てた(ゼロに向かって切り捨てた)代数的な商です。剰余は、quot * y + rem == xとなるように定義されます。

(C99まで)

商(式x / yの結果)と剰余(式x % yの結果)を同時に計算します。

(C99以降)

目次

[編集] パラメータ

x, y - 整数値

[編集] 戻り値

剰余と商の両方が対応する型(それぞれint, long, long long, intmax_t)のオブジェクトとして表現できる場合、両方をdiv_tldiv_tlldiv_timaxdiv_t型のオブジェクトとして返します。これらの型は以下のように定義されます。

div_t

struct div_t { int quot; int rem; };

or

struct div_t { int rem; int quot; };

ldiv_t

struct ldiv_t { long quot; long rem; };

or

struct ldiv_t { long rem; long quot; };

lldiv_t

struct lldiv_t { long long quot; long long rem; };

or

struct lldiv_t { long long rem; long long quot; };

imaxdiv_t

struct imaxdiv_t { intmax_t quot; intmax_t rem; };

or

struct imaxdiv_t { intmax_t rem; intmax_t quot; };

剰余または商のいずれかが表現できない場合、動作は未定義です。

[編集] 注意

C99まで、組み込みの除算演算子と剰余演算子では、オペランドのいずれかが負の場合、商の丸め方向と剰余の符号は実装定義でしたが、divldivでは明確に定義されていました。

多くのプラットフォームでは、単一のCPU命令で商と剰余の両方を取得できるため、この関数はそれを利用する可能性があります。ただし、コンパイラは適切な場合に近くにある/%をマージできることが一般的です。

[編集]

#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
 
void reverse(char* first, char* last)
{
    for (--last; first < last; ++first, --last)
    {
        char c = *last;
        *last = *first;
        *first = c;
    }
}
 
// returns empty buffer in case of buffer overflow
char* itoa(int n, int base, char* buf, size_t buf_size)
{
    assert(2 <= base && base <= 16 && buf && buf_size);
    div_t dv = {.quot = n};
    char* p = buf;
    do
    {
        if (!--buf_size)
            return (*buf = '\0'), buf;
        dv = div(dv.quot, base);
        *p++ = "0123456789abcdef"[abs(dv.rem)];
    }
    while(dv.quot);
    if (n < 0)
        *p++ = '-';
    *p = '\0';
    reverse(buf, p);
    return buf;
}
 
int main(void)
{
    char buf[16];
    printf("%s\n", itoa(0, 2, buf, sizeof buf));
    printf("%s\n", itoa(007, 3, buf, sizeof buf));
    printf("%s\n", itoa(12346, 10, buf, sizeof buf));
    printf("%s\n", itoa(-12346, 10, buf, sizeof buf));
    printf("%s\n", itoa(-42, 2, buf, sizeof buf));
    printf("%s\n", itoa(INT_MAX, 16, buf, sizeof buf));
    printf("%s\n", itoa(INT_MIN, 16, buf, sizeof buf));
}

実行結果の例

0
21
12346
-12346
-101010
7fffffff
-80000000

[編集] 参考文献

  • C23標準 (ISO/IEC 9899:2024)
  • 7.8.2.2 The imaxdiv function (p: TBD)
  • 7.22.6.2 The div, ldiv and lldiv functions (p: TBD)
  • C17標準 (ISO/IEC 9899:2018)
  • 7.8.2.2 The imaxdiv function (p: 159)
  • 7.22.6.2 The div, ldiv and lldiv functions (p: 259)
  • C11標準 (ISO/IEC 9899:2011)
  • 7.8.2.2 The imaxdiv function (p: 219)
  • 7.22.6.2 The div, ldiv and lldiv functions (p: 356)
  • C99標準 (ISO/IEC 9899:1999)
  • 7.8.2.2 The imaxdiv function (p: 200)
  • 7.20.6.2 The div, ldiv and lldiv functions (p: 320)
  • C89/C90標準 (ISO/IEC 9899:1990)
  • 4.10 div_t, ldiv_t
  • 4.10.6.2 The div function
  • 4.10.6.4 The ldiv function

[編集] 関連項目

(C99)(C99)
浮動小数点除算演算の余りを計算する
(関数) [編集]
浮動小数点除算演算の符号付き余りを計算する
(関数) [編集]
(C99)(C99)(C99)
符号付き余りおよび除算演算の最後の3ビットを計算する
(関数) [編集]

[編集] 外部リンク

1.  ユークリッド除算 — Wikipediaより。
2.  剰余(と切り捨て除算) — Wikipediaより。
English 日本語 中文(简体) 中文(繁體)