I was reading in the C99 standard about the usual arithmetic conversions.
If both operands have the same type, then no further conversion is needed.
Indeed b is converted to unsigned. However what you observed is that b converted to unsigned and then added to 10 gives as value 5.
On x86 32bit this is what happens
b, coverted to unsigned, becomes 4294967291 (i.e. 2**32 - 5)2**32 (2**32 - 5 + 10 = 2**32 + 5 = 5)