命名空间
变体
操作

div, ldiv, lldiv, imaxdiv

来自 cppreference.cn
< c‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本运算
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) (since C99)
定义于头文件 <inttypes.h>
imaxdiv_t imaxdiv( intmax_t x, intmax_t y );
(4) (since C99)

计算分子 x 除以分母 y 的商和余数。

同时计算商和余数。商是代数商,任何小数部分都被丢弃(向零截断)。余数满足 quot * y + rem == x

(until C99)

同时计算商(表达式 x / y 的结果)和余数(表达式 x % y 的结果)。

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