div, ldiv, lldiv, imaxdiv

来自cppreference.com
< c‎ | numeric‎ | math
 
 
 
常用数学函数
函数
基本运算
abs
labs
llabs
imaxabs



(C99)
fabs
div
ldiv
lldiv
imaxdiv



(C99)
fmod
remainder(C99)
remquo(C99)
fma(C99)
fmax(C99)
fmin(C99)
fdim(C99)
nan
nanf
nanl
(C99)
(C99)
(C99)
指数函数
exp
exp2(C99)
expm1(C99)
log
log10
log1p(C99)
log2(C99)
幂函数
sqrt
cbrt(C99)
hypot(C99)
pow
三角及双曲函数
sinh
cosh
tanh
asinh(C99)
acosh(C99)
atanh(C99)
误差及伽马函数
erf(C99)
erfc(C99)
lgamma(C99)
tgamma(C99)
临近整数的浮点运算
ceil
floor
round
lround
llround
(C99)
(C99)
(C99)
trunc(C99)
nearbyint(C99)
rint
lrint
llrint
(C99)
(C99)
(C99)
浮点数操作函数
ldexp
scalbn
scalbln
(C99)
(C99)
ilogb(C99)
logb(C99)
分类
fpclassify(C99)
isfinite(C99)
isinf(C99)
isnan(C99)
isnormal(C99)
signbit(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 standard (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 standard (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 standard (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)
计算浮点除法运算的余数
(函数) [edit]
计算浮点除法运算的带符号余数
(函数) [edit]
(C99)
(C99)
(C99)
计算除法运算的带符号余数,以及商的后三位
(函数) [edit]
divC++文档