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