Namensräume
Varianten
Aktionen

div, ldiv, lldiv, imaxdiv

Von cppreference.com
< c‎ | numerik‎ | math
 
 
 
Allgemeine mathematische Funktionen
Funktionen
Grundlegende Operationen
divldivlldivimaxdiv
(C99)(C99)
(C99)
(C99)
(C99)
(C99)(C99)(C99)(C23)
Maximum/Minimum-Operationen
(C99)
(C99)
Exponentialfunktionen
(C23)
(C99)
(C99)
(C23)
(C23)

(C99)
(C99)(C23)
(C23)
(C23)
Potenzfunktionen
(C99)
(C23)
(C23)

(C99)
(C23)
(C23)
Trigonometrische und hyperbolische Funktionen
(C23)
(C23)
(C23)
(C23)
(C99)
(C99)
(C99)
Nächste ganze Gleitkommazahlen
(C99)(C99)(C99)
(C99)

(C99)(C99)(C99)
(C23)(C23)(C23)(C23)
Gleitkomma-Manipulation
(C99)(C99)
(C99)(C23)
(C99)
Verengende Operationen
(C23)
(C23)
(C23)
(C23)
(C23)
(C23)
Quanten- und Quantenexponent-Funktionen
Dezimal-Neu-Kodierungsfunktionen
Gesamtordnung und Payload-Funktionen
Klassifizierung
(C99)
(C99)
(C99)
(C23)
Fehler- und Gammafunktionen
(C99)
(C99)
(C99)
(C99)
Typen
div_tldiv_tlldiv_timaxdiv_t
(C99)(C99)
Makrokonstanten
Spezielle Gleitkommawerte
(C99)(C23)
Argumente und Rückgabewerte
Fehlerbehandlung
Schnelle Operationsanzeigen
 
Definiert im Header <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) (seit C99)
Definiert in Header <inttypes.h>
imaxdiv_t imaxdiv( intmax_t x, intmax_t y );
(4) (seit C99)

Berechnet sowohl den Quotienten als auch den Rest der Division des Zählers x durch den Nenner y.

Berechnet Quotient und Rest gleichzeitig. Der Quotient ist der algebraische Quotient, wobei jeder Bruchteil verworfen wird (abgeschnitten in Richtung Null). Der Rest ist so beschaffen, dass quot * y + rem == x gilt.

(bis C99)

Berechnet den Quotienten (das Ergebnis des Ausdrucks x / y) und den Rest (das Ergebnis des Ausdrucks x % y) gleichzeitig.

(seit C99)

Inhalt

[bearbeiten] Parameter

x, y - Ganzzahlwerte

[bearbeiten] Rückgabewert

Wenn sowohl der Rest als auch der Quotient als Objekte des entsprechenden Typs (int, long, long long, intmax_t bzw.) dargestellt werden können, werden beide als Objekt vom Typ div_t, ldiv_t, lldiv_t, imaxdiv_t zurückgegeben, wie folgt definiert:

div_t

struct div_t { int quot; int rem; };

or

struct div_t { int rem; int quot; };

ldiv_t

struct ldiv_t { long quot; long rem; };

or

struct ldiv_t { long rem; long quot; };

lldiv_t

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

or

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

imaxdiv_t

struct imaxdiv_t { intmax_t quot; intmax_t rem; };

or

struct imaxdiv_t { intmax_t rem; intmax_t quot; };

Wenn entweder der Rest oder der Quotient nicht dargestellt werden kann, ist das Verhalten undefiniert.

[bearbeiten] Hinweise

Bis C99 war die Rundungsrichtung des Quotienten und das Vorzeichen des Rests in den integrierten Divisions- und Restoperatoren bei negativen Operanden implementierungsabhängig, aber in div und ldiv wohldefiniert.

Auf vielen Plattformen liefert eine einzelne CPU-Instruktion sowohl den Quotienten als auch den Rest, und diese Funktion kann dies nutzen, obwohl Compiler in der Regel in der Lage sind, nahe beieinander liegende / und % zusammenzuführen, wo dies geeignet ist.

[bearbeiten] Beispiel

#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;
    }
}
 
// returns empty buffer in case of buffer overflow
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));
}

Mögliche Ausgabe

0
21
12346
-12346
-101010
7fffffff
-80000000

[bearbeiten] Referenzen

  • C23-Standard (ISO/IEC 9899:2024)
  • 7.8.2.2 Die Funktion imaxdiv (S. TBD)
  • 7.22.6.2 Die Funktionen div, ldiv und lldiv (S. TBD)
  • C17-Standard (ISO/IEC 9899:2018)
  • 7.8.2.2 Die Funktion imaxdiv (S. 159)
  • 7.22.6.2 Die Funktionen div, ldiv und lldiv (S. 259)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.8.2.2 Die Funktion imaxdiv (S. 219)
  • 7.22.6.2 Die Funktionen div, ldiv und lldiv (S. 356)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.8.2.2 Die Funktion imaxdiv (S. 200)
  • 7.20.6.2 Die Funktionen div, ldiv und lldiv (S. 320)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 4.10 div_t, ldiv_t
  • 4.10.6.2 Die Funktion div
  • 4.10.6.4 Die Funktion ldiv

[bearbeiten] Siehe auch

(C99)(C99)
berechnet den Rest der Gleitkommadivision
(Funktion) [bearbeiten]
berechnet den vorzeichenbehafteten Rest der Gleitkommadivision
(Funktion) [bearbeiten]
(C99)(C99)(C99)
berechnet den vorzeichenbehafteten Rest sowie die drei letzten Bits der Division
(Funktion) [bearbeiten]

[bearbeiten] Externe Links

1.  Euklidische Division — Von Wikipedia.
2.  Modulo (und abgebrochene Division) — Von Wikipedia.