"%d" format is for (signed) int values. If you use it with an unsigned value, it could print something other than the actual value. Use
"%u" to see the actual value, or
%x to see it in hexadecimal.
In the declaration
unsigned int x = -1;
-1 is of type int, and has the value -1. The initializer converts this value from int to unsigned int. The rules for signed-to-unsigned conversion say that the value is reduced modulo
UINT_MAX + 1, so
-1 will convert to
UINT_MAX (which is probably
unsigned int is 32 bits).
You simply cannot assign a negative value to an object of an unsigned type. Any such value will be converted to the unsigned type before it’s assigned, and the result will always be >= 0.