div, ldiv, lldiv, imaxdiv
|
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Definido en el encabezado
<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) | (desde C99) |
|
Definido en el encabezado
<inttypes.h>
|
||
| (4) | (desde C99) | |
Calcula tanto el cociente como el resto de la división del numerador
x
por el denominador
y
.
|
Calcula el cociente y el resto simultáneamente. El cociente es el cociente algebraico con cualquier parte fraccionaria descartada (truncado hacia cero). El resto es tal que quot * y + rem == x . |
(hasta C99) |
|
Calcula el cociente (el resultado de la expresión x / y ) y el resto (el resultado de la expresión x % y ) simultáneamente. |
(desde C99) |
Contenidos |
Parámetros
| x, y | - | valores enteros |
Valor de retorno
Si tanto el resto como el cociente pueden representarse como objetos del tipo correspondiente (
int
,
long
,
long
long
,
intmax_t
, respectivamente), devuelve ambos como un objeto de tipo
div_t
,
ldiv_t
,
lldiv_t
,
imaxdiv_t
definido de la siguiente manera:
div_t
struct div_t { int quot; int rem; };
o
struct div_t { int rem; int quot; };
ldiv_t
struct ldiv_t { long quot; long rem; };
o
struct ldiv_t { long rem; long quot; };
lldiv_t
struct lldiv_t { long long quot; long long rem; };
o
struct lldiv_t { long long rem; long long quot; };
imaxdiv_t
o
Si el resto o el cociente no pueden ser representados, el comportamiento es indefinido.
Notas
Hasta C99, la dirección de redondeo del cociente y el signo del resto en los operadores de división y resto incorporados estaba definida por la implementación si alguno de los operandos era negativo, pero estaba bien definida en
div
y
ldiv
.
En muchas plataformas, una única instrucción de CPU obtiene tanto el cociente como el resto, y esta función puede aprovechar eso, aunque los compiladores generalmente pueden fusionar operaciones cercanas de / y % donde sea apropiado.
Ejemplo
#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; } } // devuelve buffer vacío en caso de desbordamiento de búfer 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)); }
Salida posible:
0 21 12346 -12346 -101010 7fffffff -80000000
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 7.8.2.2 La función imaxdiv (p: TBD)
-
- 7.22.6.2 Las funciones div, ldiv y lldiv (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
-
- 7.8.2.2 La función imaxdiv (p: 159)
-
- 7.22.6.2 Las funciones div, ldiv y lldiv (p: 259)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 7.8.2.2 La función imaxdiv (p: 219)
-
- 7.22.6.2 Las funciones div, ldiv y lldiv (p: 356)
- Estándar C99 (ISO/IEC 9899:1999):
-
- 7.8.2.2 La función imaxdiv (p: 200)
-
- 7.20.6.2 Las funciones div, ldiv y lldiv (p: 320)
- Estándar C89/C90 (ISO/IEC 9899:1990):
-
- 4.10 div_t, ldiv_t
-
- 4.10.6.2 La función div
-
- 4.10.6.4 La función ldiv
Véase también
|
(C99)
(C99)
|
calcula el resto de la operación de división de punto flotante
(función) |
|
(C99)
(C99)
(C99)
|
calcula el resto con signo de la operación de división de punto flotante
(función) |
|
(C99)
(C99)
(C99)
|
calcula el resto con signo así como los tres últimos bits de la operación de división
(función) |
|
Documentación de C++
para
div
|
|
Enlaces externos
| 1. | Euclidean division — De Wikipedia. |
| 2. | Modulo (and Truncated division) — De Wikipedia. |