#include
main() {
unsigned a = -20;
unsigned b = 10;
printf(\"%d\\n\", (a % b));
printf(\"%d\\n\", (-20 % 10));
}
Output:
6
0
And what are you expecting?
a % b is equivalent to, let's substitute the values and apply the unary - to the unsigned int value of 20, (UINT_MAX-20+1) % 10 and the type of the result is unsigned int and you're printing it with %d, which is wrong. You should use %u here.
unsigned int can hold values from 0 to UINT_MAX, no negative values. So -20 is converted to -20 + UINT_MAX + 1.
On your system:
(-20 + UINT_MAX + 1) % 10 != -20 % 10