std:: div, std:: ldiv, std:: lldiv, std:: imaxdiv
|
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) |
|
Documentation C
pour
div
|
|
Liens externes
| 1. | Division euclidienne — De Wikipédia. |
| 2. | Modulo (et Division tronquée) — De Wikipédia. |