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
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>
imaxdiv_t imaxdiv ( intmax_t x, intmax_t y ) ;
(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

struct imaxdiv_t { intmax_t quot; intmax_t rem; };

o

struct imaxdiv_t { intmax_t rem; intmax_t quot; };

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)
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)

Enlaces externos

1. Euclidean division — De Wikipedia.
2. Modulo (and Truncated division) — De Wikipedia.