Spec-Zone.ru › C

div, ldiv, lldiv, imaxdiv

Определено в заголовке <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) (с C99)
Определено в заголовке <inttypes.h>
imaxdiv_t imaxdiv( intmax_t x, intmax_t y );
(4) (с C99)

Вычисляет как частное, так и остаток от деления числителя x на знаменатель y.

Вычисляет частное и остаток одновременно. Частное — это алгебраическое частное с отброшенной дробной частью (округление к нулю). Остаток такой, что quot * y + rem == x.

(до C99)

Вычисляет частное (результат выражения x / y) и остаток (результат выражения x % y) одновременно.

(с C99)

Параметры

x, y - целочисленные значения

Возвращаемое значение

Если и остаток, и частное могут быть представлены как объекты соответствующего типа (int, long, long long, intmax_t, соответственно), возвращает оба как объект типа div_t, ldiv_t, lldiv_t, imaxdiv_t определенные следующим образом:

div_t

struct div_t { int quot; int rem; };

или

struct div_t { int rem; int quot; };

ldiv_t

struct ldiv_t { long quot; long rem; };

или

struct ldiv_t { long rem; long quot; };

lldiv_t

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

или

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

imaxdiv_t

struct imaxdiv_t { intmax_t quot; intmax_t rem; };

или

struct imaxdiv_t { intmax_t rem; intmax_t quot; };

Если остаток или частное не могут быть представлены, поведение неопределено.

Примечания

До C99 направление округления частного и знак остатка в встроенных операциях деления и остатка были определены реализацией, если хотя бы один из операндов был отрицательным, но они были определены в div и ldiv.

На многих платформах одно машинное указание процессора получает как частное, так и остаток, и эта функция может использовать это, хотя компиляторы обычно могут объединять близлежащие / и % при необходимости.

Пример

#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));
}

Возможный вывод:

0
21
12346
-12346
-101010
7fffffff
-80000000

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2023):
    • 7.8.2.2 Функция imaxdiv (с. TBD)
    • 7.22.6.2 Функции div, ldiv и lldiv (с. TBD)
  • Стандарт C17 (ISO/IEC 9899:2018):
    • 7.8.2.2 Функция imaxdiv (с. 159)
    • 7.22.6.2 Функции div, ldiv и lldiv (с. 259)
  • Стандарт C11 (ISO/IEC 9899:2011):
    • 7.8.2.2 Функция imaxdiv (с. 219)
    • 7.22.6.2 Функции div, ldiv и lldiv (с. 356)
  • Стандарт C99 (ISO/IEC 9899:1999):
    • 7.8.2.2 Функция imaxdiv (с. 200)
    • 7.20.6.2 Функции div, ldiv и lldiv (с. 320)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
    • 4.10 div_t, ldiv_t
    • 4.10.6.2 Функция div
    • 4.10.6.4 Функция ldiv

См. также

fmodfmodffmodl
(C99)(C99)
вычисляет остаток от операции деления чисел с плавающей точкой
(функция)
remainderremainderfremainderl
(C99)(C99)(C99)
вычисляет остаток от операции деления чисел с плавающей точкой (со знаком)
(функция)
remquoremquofremquol
(C99)(C99)(C99)
вычисляет остаток и три последних бита от операции деления
(функция)
Документация C++ для div

Внешние ссылки

1. Евклидово деление — Из Википедии.
2. Модуль (и усеченное деление) — Из Википедии.

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/c/numeric/math/div

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API