[c] Signed to unsigned conversion in C - is it always safe?