div, ldiv, lldiv, imaxdiv
From cppreference.com
| ヘッダー <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> で定義 |
||
| (4) | (C99以降) | |
被除数xを被除数yで割った商と剰余を両方計算します。
|
商と剰余を同時に計算します。商は、小数部分を切り捨てた(ゼロに向かって切り捨てた)代数的な商です。剰余は、quot * y + rem == xとなるように定義されます。 |
(C99まで) |
|
商(式x / yの結果)と剰余(式x % yの結果)を同時に計算します。 |
(C99以降) |
目次 |
[編集] パラメータ
| x, y | - | 整数値 |
[編集] 戻り値
剰余と商の両方が対応する型(それぞれint, long, long long, intmax_t)のオブジェクトとして表現できる場合、両方をdiv_t、ldiv_t、lldiv_t、imaxdiv_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
or
剰余または商のいずれかが表現できない場合、動作は未定義です。
[編集] 注意
C99まで、組み込みの除算演算子と剰余演算子では、オペランドのいずれかが負の場合、商の丸め方向と剰余の符号は実装定義でしたが、divとldivでは明確に定義されていました。
多くのプラットフォームでは、単一の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) |
浮動小数点除算演算の符号付き余りを計算する (関数) |
| (C99)(C99)(C99) |
符号付き余りおよび除算演算の最後の3ビットを計算する (関数) |
| C++ ドキュメント for div
| |
[編集] 外部リンク
| 1. | ユークリッド除算 — Wikipediaより。 |
| 2. | 剰余(と切り捨て除算) — Wikipediaより。 |