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
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 im 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 gleichzeitig den Quotienten und den Rest. Der Quotient ist der algebraische Quotient, wobei alle Nachkommastellen verworfen werden (abgeschnitten gegen Null). Der Rest ist so beschaffen, dass quot * y + rem == x .

(bis C99)

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

(seit C99)

Inhaltsverzeichnis

Parameter

x, y - ganzzahlige Werte

Rückgabewert

Wenn sowohl der Rest als auch der Quotient als Objekte des entsprechenden Typs ( int , long , long long , intmax_t , jeweils) dargestellt werden können, gibt beide als ein Objekt des Typs div_t , ldiv_t , lldiv_t , imaxdiv_t zurück, definiert wie folgt:

div_t

struct div_t { int quot; int rem; };

oder

struct div_t { int rem; int quot; };

ldiv_t

struct ldiv_t { long quot; long rem; };

oder

struct ldiv_t { long rem; long quot; };

lldiv_t

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

oder

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

imaxdiv_t

struct imaxdiv_t { intmax_t quot; intmax_t rem; };

oder

struct imaxdiv_t { intmax_t rem; intmax_t quot; };

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

Hinweise

Bis C99 war die Rundungsrichtung des Quotienten und das Vorzeichen des Rests in den eingebauten Divisions- und Restoperatoren implementierungsdefiniert, wenn einer der Operanden negativ war, aber es war in div und ldiv wohldefiniert.

Auf vielen Plattformen erhält eine einzelne CPU-Instruktion sowohl den Quotienten als auch den Rest, und diese Funktion kann dies nutzen, obwohl Compiler generell in der Lage sind, nahegelegene / und % Operationen zusammenzuführen, wo dies geeignet ist.

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;
    }
}
// gibt leeren Puffer bei Pufferüberlauf zurück
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

Referenzen

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

Siehe auch

(C99) (C99)
berechnet den Rest der Gleitkomma-Divisionsoperation
(Funktion)
berechnet den vorzeichenbehafteten Rest der Gleitkomma-Divisionsoperation
(Funktion)
(C99) (C99) (C99)
berechnet den vorzeichenbehafteten Rest sowie die drei letzten Bits der Divisionsoperation
(Funktion)

Externe Links

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