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>
|
||
| (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
или
Если ни остаток, ни частное не могут быть представлены, поведение не определено.
Примечания
До 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)
|
вычисляет знаковый остаток от операции деления чисел с плавающей запятой
(функция) |
|
(C99)
(C99)
(C99)
|
вычисляет знаковый остаток, а также три последних бита операции деления
(функция) |
|
C++ documentation
для
div
|
|
Внешние ссылки
| 1. | Евклидово деление — Из Википедии. |
| 2. | Модуло (и Усечённое деление) — Из Википедии. |