imaxdiv
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) | (since C99) |
Defined in header <inttypes.h> | | |
imaxdiv_t imaxdiv( intmax_t x, intmax_t y | (4) | (since C99) |
用分母x
来计算分子除法的商和余数y
。
同时计算商和余数。商是丢弃任何小数部分的代数商(截断为零)。剩下的就是“* y + rem == x”。 | (直到C99) |
---|---|
同时计算商(表达式x / y的结果)和余数(表达式x%y的结果)。 | (自C99以来) |
参数
x,y | - | 整数值 |
---|
返回值
如果这两个余数和商可以表示为相应的类型的对象(INT,很久长,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):