命名空间
变体
操作

div、ldiv、lldiv、imaxdiv

来自 cppreference.com
< c‎ | numeric‎ | math
 
 
 
常用数学函数
类型
div_tldiv_tlldiv_timaxdiv_t
(C99)(C99)    

(C99)(C99)    

函数
基本操作
divldivlldivimaxdiv
(C99)(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
最大/最小操作
(C99)
(C23)    
指数函数
(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)
(C99)
(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
浮点操作函数
(C99)(C99)
(C99)(C23)
(C99)
缩窄操作
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
量子和量子指数函数
十进制重新编码函数
全序和有效载荷函数
分类
(C99)
(C99)
(C99)
(C23)
宏常量
特殊浮点值
(C99)(C23)
参数和返回值
(C99)(C99)(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 - 整数值

[编辑] 返回值

如果余数和商都可以表示为相应类型的对象(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: TBD)
  • 7.22.6.2 div、ldiv 和 lldiv 函数 (p: TBD)
  • 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++ 文档 for div

[编辑] 外部链接

1.  欧几里得除法 — 来自维基百科。
2.  模运算(和截断除法) — 来自维基百科。