Namespaces
Variants

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

From cppreference.net
Common mathematical functions
Nearest integer floating point operations
(C++11)
(C++11)
(C++11) (C++11) (C++11)
Floating point manipulation functions
(C++11) (C++11)
(C++11)
(C++11)
Classification and comparison
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Types
div_t
ldiv_t
lldiv_t
(C++11)
imaxdiv_t
(C++11)
(C++11)
(C++11)
Macro constants
Défini dans l'en-tête <cstdlib>
std :: div_t div ( int x, int y ) ;
(1) (constexpr depuis C++23)
std :: ldiv_t div ( long x, long y ) ;
(2) (constexpr depuis C++23)
std :: lldiv_t div ( long long x, long long y ) ;
(3) (depuis C++11)
(constexpr depuis C++23)
std :: ldiv_t ldiv ( long x, long y ) ;
(4) (constexpr depuis C++23)
std :: lldiv_t lldiv ( long long x, long long y ) ;
(5) (depuis C++11)
(constexpr depuis C++23)
Défini dans l'en-tête <cinttypes>
std :: imaxdiv_t div ( std:: intmax_t x, std:: intmax_t y ) ;
(6) (depuis C++11)
(constexpr depuis C++23)
std :: imaxdiv_t imaxdiv ( std:: intmax_t x, std:: intmax_t y ) ;
(7) (depuis C++11)
(constexpr depuis C++23)

Calcule à la fois le quotient et le reste de la division du numérateur x par le dénominateur y .

6,7) Surcharge de std::div pour std::intmax_t est fournie dans <cinttypes> si et seulement si std::intmax_t est un type entier étendu .
(depuis C++11)

Le quotient est le quotient algébrique dont toute partie fractionnaire est écartée (tronqué vers zéro). Le reste est tel que quot * y + rem == x .

(jusqu'à C++11)

Le quotient est le résultat de l'expression x / y . Le reste est le résultat de l'expression x % y .

(depuis C++11)

Table des matières

Paramètres

x, y - valeurs entières

Valeur de retour

Si le reste et le quotient peuvent tous deux être représentés comme des objets du type correspondant ( int , long , long long , std::intmax_t , respectivement), retourne les deux sous la forme d'un objet de type std::div_t , std::ldiv_t , std::lldiv_t , std::imaxdiv_t défini comme suit :

std:: div_t

struct div_t { int quot; int rem; };

ou

struct div_t { int rem; int quot; };

std:: ldiv_t

struct ldiv_t { long quot; long rem; };

ou

struct ldiv_t { long rem; long quot; };

std:: lldiv_t

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

ou

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

std:: imaxdiv_t

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

ou

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

Si le reste ou le quotient ne peut pas être représenté, le comportement est indéfini.

Notes

Jusqu'à ce que le problème CWG 614 soit résolu ( N2757 ), la direction d'arrondi du quotient et le signe du reste dans les opérateurs de division et de reste intégrés étaient définis par l'implémentation si l'un des opérandes était négatif, mais ils étaient bien définis dans std::div .

Sur de nombreuses plateformes, une seule instruction CPU obtient à la fois le quotient et le reste, et cette fonction peut tirer parti de cela, bien que les compilateurs soient généralement capables de fusionner les opérations / et % voisines lorsque cela est approprié.

Exemple

#include <cassert>
#include <cmath>
#include <cstdlib>
#include <iostream>
#include <sstream>
#include <string>
std::string division_with_remainder_string(int dividend, int divisor)
{
    auto dv = std::div(dividend, divisor);
    assert(dividend == divisor * dv.quot + dv.rem);
    assert(dv.quot == dividend / divisor);
    assert(dv.rem == dividend % divisor);
    auto sign = [](int n){ return n > 0 ? 1 : n < 0 ? -1 : 0; };
    assert((dv.rem == 0) or (sign(dv.rem) == sign(dividend)));
    return (std::ostringstream() << std::showpos << dividend << " = "
                                 << divisor << " * (" << dv.quot << ") "
                                 << std::showpos << dv.rem).str();
}
std::string itoa(int n, int radix /*[2..16]*/)
{
    std::string buf;
    std::div_t dv{}; dv.quot = n;
    do
    {
        dv = std::div(dv.quot, radix);
        buf += "0123456789abcdef"[std::abs(dv.rem)]; // string literals are arrays
    }
    while (dv.quot);
    if (n < 0)
        buf += '-';
    return {buf.rbegin(), buf.rend()};
}
int main()
{
    std::cout << division_with_remainder_string(369, 10) << '\n'
              << division_with_remainder_string(369, -10) << '\n'
              << division_with_remainder_string(-369, 10) << '\n'
              << division_with_remainder_string(-369, -10) << "\n\n";
    std::cout << itoa(12345, 10) << '\n'
              << itoa(-12345, 10) << '\n'
              << itoa(42, 2) << '\n'
              << itoa(65535, 16) << '\n';
}

Sortie :

+369 = +10 * (+36) +9
+369 = -10 * (-36) +9
-369 = +10 * (-36) -9
-369 = -10 * (+36) -9
12345
-12345
101010
ffff

Voir aussi

(C++11) (C++11)
reste de l'opération de division en virgule flottante
(fonction)
(C++11) (C++11) (C++11)
reste signé de l'opération de division
(fonction)
(C++11) (C++11) (C++11)
reste signé ainsi que les trois derniers bits de l'opération de division
(fonction)

Liens externes

1. Division euclidienne — De Wikipédia.
2. Modulo (et Division tronquée) — De Wikipédia.