signed and unsigned types expression

I recently researched that it is better to avoid the use of expressions that mix signed and unsigned types because they can give us back unexpected results ...... examples if int a = -1; unsigned int b = 1; a * b = 4294967295

why if a is a long long type that does not work? because the result is -1 and not the maximum value storable in a long long type as it should be ?