Namespaces
Variants

div, ldiv, lldiv, imaxdiv

From cppreference.net
< c ‎ | numeric ‎ | math
Common mathematical functions
Functions
Basic operations
div ldiv lldiv imaxdiv
(C99) (C99)
(C99)
(C99)
(C99)
(C99) (C99) (C99) (C23)
Maximum/minimum operations
Exponential functions
Power functions
Trigonometric and hyperbolic functions
Nearest integer floating-point
(C99) (C99) (C99)
(C23) (C23) (C23) (C23)
Floating-point manipulation
Narrowing operations
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quantum and quantum exponent
Decimal re-encoding functions
Total order and payload functions
Classification
Error and gamma functions
(C99)
(C99)
(C99)
(C99)
Types
div_t ldiv_t lldiv_t imaxdiv_t
(C99) (C99)
Macro constants
Special floating-point values
Arguments and return values
Error handling
Fast operation indicators
Défini dans l'en-tête <stdlib.h>
div_t     div ( int x, int y ) ;
(1)
ldiv_t    ldiv ( long x, long y ) ;
(2)
lldiv_t   lldiv ( long long x, long long y ) ;
(3) (depuis C99)
Défini dans l'en-tête <inttypes.h>
imaxdiv_t imaxdiv ( intmax_t x, intmax_t y ) ;
(4) (depuis C99)

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

Calcule simultanément le quotient et le reste. 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'à C99)

Calcule simultanément le quotient (le résultat de l'expression x / y ) et le reste (le résultat de l'expression x % y ).

(depuis C99)

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 , intmax_t , respectivement), retourne les deux comme un objet de type div_t , ldiv_t , lldiv_t , imaxdiv_t défini comme suit :

div_t

struct div_t { int quot; int rem; };

ou

struct div_t { int rem; int quot; };

ldiv_t

struct ldiv_t { long quot; long rem; };

ou

struct ldiv_t { long rem; long quot; };

lldiv_t

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

ou

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

imaxdiv_t

struct imaxdiv_t { intmax_t quot; intmax_t rem; };

ou

struct imaxdiv_t { intmax_t rem; intmax_t quot; };

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

Notes

Jusqu'à C99, 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 div et ldiv .

Sur de nombreuses plateformes, une seule instruction CPU permet d'obtenir à 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 % adjacentes lorsque cela est approprié.

Exemple

#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
void reverse(char* first, char* last)
{
    for (--last; first < last; ++first, --last)
    {
        char c = *last;
        *last = *first;
        *first = c;
    }
}
// renvoie un tampon vide en cas de dépassement de mémoire tampon
char* itoa(int n, int base, char* buf, size_t buf_size)
{
    assert(2 <= base && base <= 16 && buf && buf_size);
    div_t dv = {.quot = n};
    char* p = buf;
    do
    {
        if (!--buf_size)
            return (*buf = '\0'), buf;
        dv = div(dv.quot, base);
        *p++ = "0123456789abcdef"[abs(dv.rem)];
    }
    while(dv.quot);
    if (n < 0)
        *p++ = '-';
    *p = '\0';
    reverse(buf, p);
    return buf;
}
int main(void)
{
    char buf[16];
    printf("%s\n", itoa(0, 2, buf, sizeof buf));
    printf("%s\n", itoa(007, 3, buf, sizeof buf));
    printf("%s\n", itoa(12346, 10, buf, sizeof buf));
    printf("%s\n", itoa(-12346, 10, buf, sizeof buf));
    printf("%s\n", itoa(-42, 2, buf, sizeof buf));
    printf("%s\n", itoa(INT_MAX, 16, buf, sizeof buf));
    printf("%s\n", itoa(INT_MIN, 16, buf, sizeof buf));
}

Sortie possible :

0
21
12346
-12346
-101010
7fffffff
-80000000

Références

  • Norme C23 (ISO/CEI 9899:2024) :
  • 7.8.2.2 La fonction imaxdiv (p: TBD)
  • 7.22.6.2 Les fonctions div, ldiv et lldiv (p: TBD)
  • Norme C17 (ISO/CEI 9899:2018) :
  • 7.8.2.2 La fonction imaxdiv (p: 159)
  • 7.22.6.2 Les fonctions div, ldiv et lldiv (p: 259)
  • Norme C11 (ISO/IEC 9899:2011) :
  • 7.8.2.2 La fonction imaxdiv (p: 219)
  • 7.22.6.2 Les fonctions div, ldiv et lldiv (p: 356)
  • Norme C99 (ISO/CEI 9899:1999) :
  • 7.8.2.2 La fonction imaxdiv (p : 200)
  • 7.20.6.2 Les fonctions div, ldiv et lldiv (p : 320)
  • Norme C89/C90 (ISO/CEI 9899:1990) :
  • 4.10 div_t, ldiv_t
  • 4.10.6.2 La fonction div
  • 4.10.6.4 La fonction ldiv

Voir aussi

(C99) (C99)
calcule le reste de l'opération de division en virgule flottante
(fonction)
calcule le reste signé de l'opération de division en virgule flottante
(fonction)
(C99) (C99) (C99)
calcule le 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.