The modulo %
operator of C++ behaves strangely when operands are (un)signed
or long
.
Why would mod(signed int, unsigned int)
and mod(signed long long int, unsigned long long int)
produce different results? How do I do if I want the correct one (here: 11183)?
Note: If I follow my algorithm, I should call uint64_t mod(int64_t, uint64_t)
.
// Tip: 11183 is the "correct" expected result.
( int)(-3365) % ( int)(15156) = -3365
( signed int)(-3365) % ( signed int)(15156) = -3365
(unsigned int)(-3365) % (unsigned int)(15156) = 11183
( signed int)(-3365) % (unsigned int)(15156) = 11183
(unsigned int)(-3365) % ( signed int)(15156) = 11183
( long int)(-3365) % ( long int)(15156) = -3365
( signed long int)(-3365) % ( signed long int)(15156) = -3365
(unsigned long int)(-3365) % (unsigned long int)(15156) = 2555
( signed long int)(-3365) % (unsigned long int)(15156) = 2555
(unsigned long int)(-3365) % ( signed long int)(15156) = 2555
( long long int)(-3365) % ( long long int)(15156) = -3365
( signed long long int)(-3365) % ( signed long long int)(15156) = -3365
(unsigned long long int)(-3365) % (unsigned long long int)(15156) = 2555
( signed long long int)(-3365) % (unsigned long long int)(15156) = 2555
(unsigned long long int)(-3365) % ( signed long long int)(15156) = 2555
( int_fast16_t)(-3365) % ( int_fast16_t)(15156) = -3365
( uint_fast16_t)(-3365) % ( int_fast16_t)(15156) = 2555
( int_fast16_t)(-3365) % ( uint_fast16_t)(15156) = 2555
( uint_fast16_t)(-3365) % ( uint_fast16_t)(15156) = 2555
( int_fast32_t)(-3365) % ( int_fast32_t)(15156) = -3365
( uint_fast32_t)(-3365) % ( int_fast32_t)(15156) = 2555
( int_fast32_t)(-3365) % ( uint_fast32_t)(15156) = 2555
( uint_fast32_t)(-3365) % ( uint_fast32_t)(15156) = 2555
( int_fast64_t)(-3365) % ( int_fast64_t)(15156) = -3365
( uint_fast64_t)(-3365) % ( int_fast64_t)(15156) = 2555
( int_fast64_t)(-3365) % ( uint_fast64_t)(15156) = 2555
( uint_fast64_t)(-3365) % ( uint_fast64_t)(15156) = 2555
PS: More information about my system:
Linux pc-gi-446 4.4.0-36-generic #55-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux
g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609