div, ldiv, lldiv, imaxdiv
| 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> |
||
| (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
or
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) |
| (C99)(C99)(C99) |
berechnet den vorzeichenbehafteten Rest der Gleitkommadivision (Funktion) |
| (C99)(C99)(C99) |
berechnet den vorzeichenbehafteten Rest sowie die drei letzten Bits der Division (Funktion) |
| C++ Dokumentation für div
| |
[bearbeiten] Externe Links
| 1. | Euklidische Division — Von Wikipedia. |
| 2. | Modulo (und abgebrochene Division) — Von Wikipedia. |