|
|
|
Defined in header <stdlib.h> | ||
div_t div(int x,int y); | (1) | |
ldiv_t ldiv(long x,long y); | (2) | |
lldiv_t lldiv(longlong x,longlong y); | (3) | (since C99) |
Defined in header <inttypes.h> | ||
(4) | (since C99) | |
Computes both the quotient and the remainder of the division of the numeratorx
by the denominatory
.
Computes quotient and remainder simultaneously. The quotient is the algebraic quotient with any fractional part discarded (truncated towards zero). The remainder is such thatquot* y+ rem== x. | (until C99) |
Computes the quotient (the result of the expressionx/ y) and remainder (the result of the expressionx% y) simultaneously. | (since C99) |
Contents |
x, y | - | integer values |
If both the remainder and the quotient can be represented as objects of the corresponding type (int,long,longlong,intmax_t, respectively), returns both as an object of typediv_t
,ldiv_t
,lldiv_t
,imaxdiv_t
defined as follows:
struct div_t{int quot;int rem;};
or
struct div_t{int rem;int quot;};
struct ldiv_t{long quot;long rem;};
or
struct ldiv_t{long rem;long quot;};
struct lldiv_t{longlong quot;longlong rem;};
or
struct lldiv_t{longlong rem;longlong quot;};
or
If either the remainder or the quotient cannot be represented, the behavior is undefined.
Until C99, the rounding direction of the quotient and the sign of the remainder in the built-in division and remainder operators was implementation-defined if either of the operands was negative, but it was well-defined indiv
andldiv
.
On many platforms, a single CPU instruction obtains both the quotient and the remainder, and this function may leverage that, although compilers are generally able to merge nearby/ and% where suitable.
#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 overflowchar* 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));}
Possible output:
02112346-12346-1010107fffffff-80000000
(C99)(C99) | computes remainder of the floating-point division operation (function)[edit] |
(C99)(C99)(C99) | computes signed remainder of the floating-point division operation (function)[edit] |
(C99)(C99)(C99) | computes signed remainder as well as the three last bits of the division operation (function)[edit] |
C++ documentation fordiv |
1. | Euclidean division — From Wikipedia. |
2. | Modulo (and Truncated division) — From Wikipedia. |