Espacios de nombres
Variantes
Acciones

std::div, std::ldiv, std::lldiv

De cppreference.com
< cpp‎ | numeric‎ | math
 
 
 
Funciones matemáticas comunes
Funciones
Operaciones básicas
divldivlldivimaxdiv
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
Funciones exponenciales
(C++11)
(C++11)
(C++11)
(C++11)
Funciones de potencias
(C++11)
(C++11)
Funciones trigonométricas e hiperbólicas
(C++11)
(C++11)
(C++11)
Funciones de error y gamma
(C++11)
(C++11)
(C++11)
(C++11)
Operaciones de punto flotante del entero más cercano
(C++11)(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)(C++11)
Funciones de manipulación de punto flotante
(C++11)(C++11)
(C++11)
(C++11)
(C++11)(C++11)
(C++11)
Clasificación/comparación
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Constantes de macro
(C++11)(C++11)(C++11)(C++11)(C++11)
 
Definido en el archivo de encabezado <cstdlib>
std::div_t     div( int x, int y );
(1) (constexpr since C++23)
std::ldiv_t    div( long x, long y );
(2) (constexpr since C++23)
std::lldiv_t   div( long long x, long long y );
(3) (desde C++11)
(constexpr since C++23)
std::ldiv_t   ldiv( long x, long y );
(4) (constexpr since C++23)
std::lldiv_t lldiv( long long x, long long y );
(5) (desde C++11)
(constexpr since C++23)
Definido en el archivo de encabezado <cinttypes>
std::imaxdiv_t div( std::intmax_t x, std::intmax_t y );
(6) (desde C++11)
std::imaxdiv_t imaxdiv( std::intmax_t x, std::intmax_t y );
(7) (desde C++11)

Calcula el cociente y el resto de la división del numerador x por el denominador y.

La sobrecarga de std::div para std::intmax_t se proporciona en el encabezado <cinttypes> si y solo si std::intmax_t es un tipo entero extendido.

(desde C++11)

El cociente es el cociente algebraico con cualquier parte fraccionaria descartada (truncada hacia cero). El resto es tal que quot * y + rem == x.

(hasta C++11)

El cociente es el resultado de la expresión x/y. El resto es el resultado de la expresión x%y.

(desde C++11)

Contenido

[editar] Parámetros

x, y - Valores enteros.

[editar] Valor de retorno

Si tanto el resto como el cociente pueden representarse como objetos del tipo correspondiente (int, long, long long, std::imaxdiv_t, respectivamente), devuelve ambos como un objeto de tipo std::div_t, std::ldiv_t, std::lldiv_t, std::imaxdiv_t definidos de la manera siguiente:

std::div_t

struct div_t { int quot; int rem; };

o

struct div_t { int rem; int quot; };

std::ldiv_t

struct ldiv_t { long quot; long rem; };

o

struct ldiv_t { long rem; long quot; };

std::lldiv_t

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

o

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

std::imaxdiv_t

struct imaxdiv_t { std::intmax_t quot; std::intmax_t rem; };

o

struct imaxdiv_t { std::intmax_t rem; std::intmax_t quot; };


Si el resto o el cociente no se pueden representar, el comportamiento no está definido.

[editar] Notas

Hasta C++11, la dirección del redondeo del cociente y el signo del resto en los operadores integrados de división y resto estaba definido por la implementación si cualquiera de los operandos era negativo, pero estaba bien definido en std::div.

En muchas plataformas, una sola instrucción de CPU obtiene tanto el cociente como el resto, y esta función puede aprovechar eso, aunque los compiladores generalmente pueden fusionar / y % cercanos donde sea adecuado.

[editar] Ejemplo

#include <string>
#include <cmath>
#include <cstdlib>
#include <iostream>
 
std::string itoa(int n, int base)
{
    std::string buf;
    std::div_t dv{}; dv.quot = n;
    do {
        dv = std::div(dv.quot, base);
        buf += "0123456789abcdef"[std::abs(dv.rem)];  // literales de cadena son arrays
    } while(dv.quot);
    if(n<0) buf += '-';
    return {buf.rbegin(), buf.rend()};
}
 
int main()
{
    std::cout << itoa(12345, 10) << '\n'
              << itoa(-12345, 10) << '\n'
              << itoa(65535, 16) << '\n';
}

Salida:

12345
-12345
ffff

[editar] Véase también

(C++11)(C++11)
El resto de la operación de división de punto flotante
(función) [editar]
(C++11)(C++11)(C++11)
Resto con signo de la operación de división
(función) [editar]
(C++11)(C++11)(C++11)
Resto con signo, así como los tres últimos bits de la operación de división
(función) [editar]