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 로 나눈 몫과 나머지를 모두 계산합니다.

몫과 나머지를 동시에 계산합니다. 몫은 대수적 몫에서 소수 부분을 버린 값(0 방향으로 절사)입니다. 나머지는 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 에서는 명확하게 정의되어 있었습니다.

많은 플랫폼에서 단일 CPU 명령어로 몫과 나머지를 모두 구할 수 있으며, 이 함수는 이를 활용할 수 있습니다. 비록 컴파일러들이 일반적으로 인접한 / % 연산을 적절한 경우 병합할 수 있지만요.

예제

#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 함수 (p: TBD)
  • 7.22.6.2 div, ldiv 및 lldiv 함수 (p: TBD)
  • C17 표준 (ISO/IEC 9899:2018):
  • 7.8.2.2 imaxdiv 함수 (p: 159)
  • 7.22.6.2 div, ldiv 및 lldiv 함수 (p: 259)
  • C11 표준 (ISO/IEC 9899:2011):
  • 7.8.2.2 The imaxdiv function (p: 219)
  • 7.22.6.2 The div, ldiv and lldiv functions (p: 356)
  • C99 표준 (ISO/IEC 9899:1999):
  • 7.8.2.2 imaxdiv 함수 (p: 200)
  • 7.20.6.2 div, ldiv 및 lldiv 함수 (p: 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. Euclidean division — 위키백과 출처.
2. Modulo (and Truncated division) — 위키백과 출처.