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.
| Вычисляет частное и остаток одновременно. Частное — это алгебраическое частное с отброшенной дробной частью (округление к нулю). Остаток такой, что | (до C99) |
| Вычисляет частное (результат выражения | (с 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
См. также
|
(C99)(C99) | вычисляет остаток от операции деления чисел с плавающей точкой (функция) |
|
(C99)(C99)(C99) | вычисляет остаток от операции деления чисел с плавающей точкой (со знаком) (функция) |
|
(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