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
로 나눈 몫과 나머지를 모두 계산합니다.
|
몫과 나머지를 동시에 계산합니다. 몫은 대수적 몫에서 소수 부분을 버린 값(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
또는
나머지나 몫 중 하나라도 표현할 수 없는 경우, 그 동작은 정의되지 않습니다.
참고 사항
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)
|
부호 있는 부동소수점 나눗셈 연산의 나머지를 계산합니다
(함수) |
|
(C99)
(C99)
(C99)
|
부호 있는 나머지와 나눗셈 연산의 마지막 세 비트를 계산합니다
(함수) |
|
C++ documentation
for
div
|
|
외부 링크
| 1. | Euclidean division — 위키백과 출처. |
| 2. | Modulo (and Truncated division) — 위키백과 출처. |