div, ldiv, lldiv, imaxdiv
來自 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; };
或
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
或
如果餘數或商無法表示,則行為未定義。
[編輯] 注意
在 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 imaxdiv 函式(p:待定)
- 7.22.6.2 div、ldiv 和 lldiv 函式(p:待定)
- C17 標準 (ISO/IEC 9899:2018)
- 7.8.2.2 imaxdiv 函式 (p: 159)
- 7.22.6.2 div、ldiv 和 lldiv 函式 (p: 259)
- C11 標準 (ISO/IEC 9899:2011)
- 7.8.2.2 imaxdiv 函式 (p: 219)
- 7.22.6.2 div、ldiv 和 lldiv 函式 (p: 356)
- C99 標準 (ISO/IEC 9899:1999)
- 7.8.2.2 imaxdiv 函式 (p: 200)
- 7.20.6.2 div、ldiv 和 lldiv 函式 (p: 320)
- C89/C90 標準 (ISO/IEC 9899:1990)
- 4.10 div_t, ldiv_t
- 4.10.6.2 div 函式
- 4.10.6.4 ldiv 函式
[編輯] 另請參閱
(C99)(C99) |
計算浮點除法運算的餘數 (函式) |
(C99)(C99)(C99) |
計算浮點除法運算的帶符號餘數 (函式) |
(C99)(C99)(C99) |
計算帶符號餘數以及除法運算的最後三位 (函式) |
C++ 文件 關於 div
|
[編輯] 外部連結
1. | 歐幾里得除法 — 來自維基百科。 |
2. | 模運算(和截斷除法) — 來自維基百科。 |