# std::div, std::ldiv, std::lldiv

< cpp‎ | numeric‎ | math

定义于头文件 `<cstdlib>` |  |
std::div_t div( int x, int y ); | (1) |
std::ldiv_t div( long x, long y ); | (2) |
std::lldiv_t div( long long x, long long y ); | (3) | (C++11 起)
std::ldiv_t ldiv( long x, long y ); | (4) |
std::lldiv_t lldiv( long long x, long long y ); | (5) | (C++11 起)
定义于头文件 `<cinttypes>` |  |
std::imaxdiv_t div( std::intmax_t x, std::intmax_t y ); | (6) | (C++11 起)
std::imaxdiv_t imaxdiv( std::intmax_t x, std::intmax_t y ); | (7) | (C++11 起)

计算分子 `x` 除以分母 `y` 的商和余数。

`<cinttypes>` 中提供 `std::div` 对 `std::intmax_t` 的重载，当且仅当 `std::intmax_t` 为扩展整数类型。 | (C++11 起)

商是舍弃任何小数部分（向零截断）的代数商。余数满足 quot * y + rem == x 。 | (C++11 前)
商是表达式 x/y 的结果。余数是表达式 x%y 的结果。 | (C++11 起)

### 参数

x, y | - | 整数值

### 返回值

若余数与上皆能表示成对应类型（分别为 int 、 long 、 long long 、 std::imaxdiv_t ）的对象，则返回作为定义于下的 `std::div_t` 、 `std::ldiv_t` 、 `std::lldiv_t` 、 `std::imaxdiv_t` 类型对象的二者：

## std::div_t

    struct div_t { int quot; int rem; };

或

    struct div_t { int rem; int quot; };

## std::ldiv_t

    struct ldiv_t { long quot; long rem; };

或

    struct ldiv_t { long rem; long quot; };

## std::lldiv_t

    struct lldiv_t { long long quot; long long rem; };

或

    struct lldiv_t { long long rem; long long quot; };

## std::imaxdiv_t

    struct imaxdiv_t { std::intmax_t quot; std::intmax_t rem; };

或

    struct imaxdiv_t { std::intmax_t rem; std::intmax_t quot; };

若余数或商之一无法表示，则行为未定义。

### 注解

C++11 前，若运算数之一为负，则内建除法与取余运算符中商的舍入方向和余数的符号是实现定义的，但在 `std::div` 中已为良定义。

多数平台上，单条 CPU 指令一同获得商与余数，而此函数可以活用这点，尽管编译器通常能够在适合处合并邻近的 / 与 % 。

### 示例

    #include <string>
    #include <cmath>
    #include <cstdlib>
    #include <iostream>

    std::string itoa(int n, int base)
    {
        std::string buf;
        std::div_t dv{}; dv.quot = n;
        do {
            dv = std::div(dv.quot, base);
            buf += "0123456789abcdef"[std::abs(dv.rem)];  // 字符串字面量是数组
        } while(dv.quot);
        if(n<0) buf += '-';
        return {buf.rbegin(), buf.rend()};
    }

    int main()
    {
        std::cout << itoa(12345, 10) << '\n'
                  << itoa(-12345, 10) << '\n'
                  << itoa(65535, 16) << '\n';
    }

输出：

    12345
    -12345
    ffff

### 参阅

fmod fmodf fmodl (C++11)(C++11) | 浮点除法运算的余数 (函数)
remainder remainderf remainderl (C++11)(C++11)(C++11) | 除法运算的有符号余数 (函数)
remquo remquof remquol (C++11)(C++11)(C++11) | 除法运算的有符号余数和最后三个二进制位 (函数)