Search code examples
cunsignedmodulusunsigned-integer

C : Modulus operator on unsigned int gives unexpected output


#include <stdio.h>

main() {
    unsigned a = -20;
    unsigned b = 10;
    printf("%d\n", (a % b));
    printf("%d\n", (-20 % 10));
}

Output:
6
0

The second printf prints the expected value of 0 while the first printf prints 6. Why this unexpected output with unsigned ints?


Solution

  • 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