C
数值 | Numerics

div

div, ldiv, lldiv, imaxdiv

在头文件中定义
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以来)

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

同时计算商和余数。商是丢弃任何小数部分的代数商(截断为零)。剩下的就是“* y + rem == x”。(直到C99)
同时计算商(表达式x / y的结果)和余数(表达式x%y的结果)。(自C99以来)

参数

x, y-integer values

返回值

如果余数和商可以表示为相应类型的对象(分别为int,long,long long和imaxdiv_t),则将它们作为类型为div_t,ldiv_t,lldiv_t,imaxdiv_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之前,如果两个操作数中的任何一个都是负数,那么在内置除法运算符和余数运算符中商的舍入方向和余数的符号是实现定义的,但在div和ldiv中定义明确。

在许多平台上,单个CPU指令获得商和余数,并且该函数可以利用该指令,尽管编译器通常能够在合适的地方合并near /和%。

#include <stdio.h> #include <math.h> #include <stdlib.h> // demo only: does not check for buffer overflow 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; } // reverse } 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):

扩展内容

fmodfmodffmodl(C99)(C99)计算浮点除法操作的剩余部分(函数)
remainderremainderfremainderl (C99)(C99)(C99) 计算浮点除法运算的有符号余数(函数)
remquoremquofremquol(C99)(C99)(C99)计算带符号的余数以及除法操作(函数)的最后三位

|div的 C ++文档 |