div, ldiv, lldiv, imaxdiv

来自cppreference.com
< c‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本运算
divldivlldivimaxdiv
(C99)(C99)
(C99)
(C99)
(C99)
(C99)(C99)(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)
类型
div_tldiv_tlldiv_timaxdiv_t
(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 - 整数值

返回值

若余数和商都能表示成对应类型的对象(分别为 div_tldiv_tlldiv_timaxdiv_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 <stdio.h>
#include <math.h>
#include <stdlib.h>
 
// 只为演示:不检查缓冲区溢出
void itoa(int n, int base, char* buf)
{
    div_t dv = {.quot = n};
    char* p = buf;
    do {
        dv = div(dv.quot, base);
        *p++ = "0123456789abcdef"[abs(dv.rem)];
    } while(dv.quot);
    if(n<0) *p++ = '-';
    *p-- = '\0';
    while(buf < p) { char c = *p; *p-- = *buf; *buf++ = c; } // 反转
}
 
int main(void)
{
    char buf[100];
    itoa(12346, 10, buf);
    printf("%s\n", buf);
    itoa(-12346, 10, buf);
    printf("%s\n", buf);
    itoa(65535, 16, buf);
    printf("%s\n", buf);
}

输出:

12346
-12346
ffff

引用

  • C11 标准(ISO/IEC 9899:2011):
  • 7.8.2.2 The imaxdiv function (p: 219)
  • 7.22.6.2 The div, ldiv and lldiv functions (p: 356)
  • C99 标准(ISO/IEC 9899:1999):
  • 7.8.2.2 The imaxdiv function (p: 200)
  • 7.20.6.2 The div, ldiv and lldiv functions (p: 320)
  • C89/C90 标准(ISO/IEC 9899:1990):
  • 4.10 div_t, ldiv_t
  • 4.10.6.2 The div function
  • 4.10.6.4 The ldiv function

参阅

(C99)(C99)
计算浮点除法运算的余数
(函数)
计算浮点除法运算的带符号余数
(函数)
(C99)(C99)(C99)
计算除法运算的带符号余数,以及商的后三位
(函数)