名前空間
変種
操作

div, ldiv, lldiv, imaxdiv

提供: cppreference.com
< c‎ | numeric‎ | math
 
 
 
一般的な数学関数
関数
基本操作
divldivlldivimaxdiv
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)
指数関数
(C99)
(C99)
(C99)
(C99)
冪関数
(C99)
(C99)
三角関数と双曲線関数
(C99)
(C99)
(C99)
誤差関数とガンマ関数
(C99)
(C99)
(C99)
(C99)
最も近い整数
(C99)(C99)(C99)
(C99)
(C99)(C99)(C99)
浮動小数点操作関数
(C99)(C99)
(C99)
(C99)
分類
(C99)
(C99)
(C99)
div_tldiv_tlldiv_timaxdiv_t
(C99)(C99)
(C99)(C99)
マクロ定数
 
ヘッダ <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, imaxdiv_t) のオブジェクトとして表現可能な場合は、以下のように定義される型 div_t, ldiv_t, lldiv_t, imaxdiv_t のオブジェクトとしてその両方を返します。

div_t

struct div_t { int quot; int rem; };

または

struct div_t { int rem; int quot; };

ldiv_t

struct ldiv_t { long quot; long rem; };

または

struct ldiv_t { long rem; long quot; };

lldiv_t

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

または

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

imaxdiv_t

struct imaxdiv_t { intmax_t quot; intmax_t rem; };

または

struct imaxdiv_t { intmax_t rem; intmax_t quot; };

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

[編集] ノート

C99 までは、いずれかの被演算子が負の場合、組み込みの除算および剰余演算子における商の丸め方向と余りの符号は処理系定義でしたが、 div および ldiv では well-defined でした。

多くのプラットフォームでは単一の CPU 命令で商と余りの両方を取得でき、この関数はそれを活用するかもしれません。 とはいえ、コンパイラは一般的に、近接する / および % を、適切な場合はマージすることができます。

[編集]

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
 
// demo only: does not check for buffer overflow
void itoa(int n, int base, char* buf)
{
    div_t dv = {.quot = n};
    char* p = buf;
    do {
        dv = div(dv.quot, base);
        *p++ = "0123456789abcdef"[abs(dv.rem)];
    } while(dv.quot);
    if(n<0) *p++ = '-';
    *p-- = '\0';
    while(buf < p) { char c = *p; *p-- = *buf; *buf++ = c; } // reverse
}
 
int main(void)
{
    char buf[100];
    itoa(12346, 10, buf);
    printf("%s\n", buf);
    itoa(-12346, 10, buf);
    printf("%s\n", buf);
    itoa(65535, 16, buf);
    printf("%s\n", buf);
}

出力:

12346
-12346
ffff

[編集] 参考文献

  • C11 standard (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 standard (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 standard (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)
浮動小数点除算の余りを計算します
(関数) [edit]
浮動小数点除算の符号付きの余りを計算します
(関数) [edit]
(C99)(C99)(C99)
除算の下位3ビットと符号付きの余りを計算します
(関数) [edit]