This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Modulo operation in C for -ve values


Subject: Modulo operation in C for -ve values

The Modulo operation as specified in
http://xenia.media.mit.edu/~bdenckla/thesis/texts/htthe/node13.html says that
for a fraction like n/k which can be expressed as n/k = i + j/k the C division
and mod operation should yeild
n div k = i (integer part)
n mod k = j (remainder part)
For n +ve above is true
For n -ve
-n/k = -i + j/k
-n div k = -i
-n mod k = j (+ve remainder)

But running a sample program on Redhat enterprise Linux EL4
with gcc version 3.4.3 20041212 (Red Hat 3.4.3-9.EL4)
on a Intel PIV Machine 

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int n,k,j;
n=-3;
k=8; /* k is power of 2 */
j=(n/k);
printf("n n div k = %d", j);
j=(n%k);
printf("\n n mod k = %d", j);
j=(n) & (k-1);
printf("\n n & k-1 = %d", j);
}
gives following output for n = -3 k = 8
n div k = 0
n mod k = -3
n & k-1 = 5
though it should have been as per hypothesis proposed in
http://xenia.media.mit.edu/~bdenckla/thesis/texts/htthe/node13.html
n div k = -1
n mod k = 5 
n & k-1 = 5

Which is correct(0,-3,5) or (-1,5,5)?

Thanks

Deepak Gaur


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]