std::div, std::ldiv, std::lldiv_C++中文网

定义于头文件 <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 的商和余数

商是舍弃任何小数部分(向零截断)的代数商。余数满足 quot * y + rem == x

(C++11 前)

商是表达式 x/y 的结果。余数是表达式 x%y 的结果。

(C++11 起)

参数

返回值

若余数与上皆能表示成对应类型(分别为 int 、 long 、 long long 、 std::imaxdiv_t )的对象,则返回作为定义于下的 std::div_tstd::ldiv_tstd::lldiv_tstd::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; };

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

注意

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';
}

输出:

参阅