命名空间
变体
操作

div, ldiv, lldiv, imaxdiv

来自 cppreference.cn
< 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.  模运算(和截断除法) — 来自维基百科。