div、ldiv、lldiv、imaxdiv
来自 cppreference.com
定义在头文件 <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> 中 |
||
(4) | (自 C99) | |
计算分子 x
除以分母 y
的商和余数。
同时计算商和余数。商是代数商,任何小数部分都会被丢弃(向零截断)。余数使得 quot * y + rem == x. |
(直到 C99) |
同时计算商(表达式 x / y 的结果)和余数(表达式 x % y 的结果)。 |
(自 C99) |
内容 |
[编辑] 参数
x, y | - | 整数值 |
[编辑] 返回值
如果余数和商都可以表示为相应类型的对象(int、long、long long、intmax_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
或
如果余数或商不能表示,则行为未定义。
[编辑] 注释
在 C99 之前,如果任一操作数为负,内置除法和余数运算符的商的舍入方向和余数的符号是实现定义的,但它在 div
和 ldiv
中是定义良好的。
在许多平台上,单个 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: TBD)
- 7.22.6.2 div、ldiv 和 lldiv 函数 (p: TBD)
- 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) |
计算浮点数除法运算的有符号余数 (函数) |
(C99)(C99)(C99) |
计算有符号余数以及除法运算的最后三位 (函数) |
C++ 文档 for div
|
[编辑] 外部链接
1. | 欧几里得除法 — 来自维基百科。 |
2. | 模运算(和截断除法) — 来自维基百科。 |