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

< cpp‎ | numeric‎ | math
 
 
数值库
常用数学函数
数学特殊函数 (C++17)
数学常数 (C++20)
浮点环境 (C++11)
复数
数值数组
伪随机数生成
编译时有理数算术 (C++11)
数值算法
(C++17)
(C++17)
插值
(C++20)
(C++20)
通用数值运算
(C++11)
位操作
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
(C++20)
 
常用数学函数
函数
基本运算
divldivlldivimaxdiv
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
指数函数
(C++11)
(C++11)
(C++11)
(C++11)
幂函数
(C++11)
(C++11)
三角与双曲函数
(C++11)
(C++11)
(C++11)
误差与伽马函数
(C++11)
(C++11)
(C++11)
(C++11)
临近整数的浮点运算
(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
浮点操作函数
(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)
(C++11)
分类/比较
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
宏常量
(C++11)(C++11)(C++11)(C++11)(C++11)
 
定义于头文件 <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 起)

参数

x, y - 整数值

返回值

若余数与上皆能表示成对应类型(分别为 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; };

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

参阅

(C++11)(C++11)
浮点除法运算的余数
(函数)
(C++11)(C++11)(C++11)
除法运算的有符号余数
(函数)
(C++11)(C++11)(C++11)
除法运算的有符号余数和最后三个二进制位
(函数)