The draft C99 standard says:
Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type.
So, in this case the 64-bit value would be converted by repeatedly subtracting 0x1_0000_0000
from it until the result fits in 32 bits (underscores added for readability).
In your case, after one such subtraction the result is 0x22223333
. It seems pretty clear that it can be proven that this is the same thing as just doing the truncation, I really don't think actual subtractions ever happen.