Re: Modulo operation in C for -ve values

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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

[Index of Archives]     [Linux C Programming]     [Linux Kernel]     [eCos]     [Fedora Development]     [Fedora Announce]     [Autoconf]     [The DWARVES Debugging Tools]     [Yosemite Campsites]     [Yosemite News]     [Linux GCC]

  Powered by Linux