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
Определено в заголовке <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;
    }
}
// возвращает пустой буфер в случае переполнения буфера
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:2024):
  • 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

Смотрите также

(C99) (C99)
вычисляет остаток от операции деления чисел с плавающей запятой
(функция)
вычисляет знаковый остаток от операции деления чисел с плавающей запятой
(функция)
(C99) (C99) (C99)
вычисляет знаковый остаток, а также три последних бита операции деления
(функция)

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

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