名稱空間
變體
操作

div, ldiv, lldiv, imaxdiv

來自 cppreference.com
< c‎ | 數值‎ | 數學
 
 
 
常用數學函式
函式
基本操作
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)
量子與量子指數
十進位制重新編碼函式
總序和載荷函式
分類
(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 - 整數值

[編輯] 返回值

如果餘數和商都可以表示為相應型別(分別為 intlonglong longintmax_t)的物件,則將它們作為一個 div_tldiv_tlldiv_timaxdiv_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 之前,如果任一運算元為負,內建的除法和取餘運算子的商的舍入方向和餘數的符號是實現定義的,但在 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 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)
計算帶符號餘數以及除法運算的最後三位
(函式) [編輯]
C++ 文件 關於 div

[編輯] 外部連結

1.  歐幾里得除法 — 來自維基百科。
2.  模運算(和截斷除法) — 來自維基百科。