Reading about the integer promotion and integer conversion rank I found this link
1.If both operands have the same type, then no further convers
Case 4 applies if you have an unsigned type that is smaller in rank than the signed type it is operating with and they have different sizes. Case 5 then if the two are the same size.
For example, on my system int is 32-bit, long is 64-bit, and long long is 64-bit. If you then have the following:
unsigned int a; // range: 0 to 4294967295
long b; // range: -9223372036854775808 to 9223372036854775807
unsigned long c; // range: 0 to 18446744073709551615
long long d; // range: -9223372036854775808 to 9223372036854775807
For an expression involving a and b, which are unsigned int and long, any valid unsigned int can fit in a long. So a is converted to long in that situation.
Conversely, For an expression involving c and d, which are unsigned long and long long, a long long cannot hold all values of an unsigned long. So both operands are converted to unsigned long long.
Regarding what happens during a promotion / conversion on the bit level, let's first assume that the lower rank type is smaller than the higher rank type, and that signed types use 2's complement representation.
For a conversion from a 32 bit int to a 64 bit long, if the value is positive, 4 bytes containing all 0 bits are added on the left. If the value is negative, 4 bytes containing all 1 bits are added on the left. For example, the representation of value 5 changes from 0x00000005 to 0x0000000000000005. For the value -5, the representation changes from 0xfffffffb to 0xfffffffffffffffb.