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 im 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 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
oder
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) |
|
(C99)
(C99)
(C99)
|
berechnet den vorzeichenbehafteten Rest der Gleitkomma-Divisionsoperation
(Funktion) |
|
(C99)
(C99)
(C99)
|
berechnet den vorzeichenbehafteten Rest sowie die drei letzten Bits der Divisionsoperation
(Funktion) |
|
C++ documentation
für
div
|
|
Externe Links
| 1. | Euklidische Division — Von Wikipedia. |
| 2. | Modulo (und Truncated division) — Von Wikipedia. |