I've redirected this to gcc-help, since it's a question about using gcc, not about developing gcc. Deepak Gaur writes: > 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)? gcc is correct. Your mistake is to assume that the C operator % represents the mathematical modulo. It doesn't: % is the remainder after division, not modulo arithmetic. C only supports modulo on unsigned quantities. Andrew. -- Red Hat UK Ltd, Amberley Place, 107-111 Peascod Street, Windsor, Berkshire, SL4 1TE, UK Registered in England and Wales No. 3798903