printf や scanf などの書式指定は、対象の変数の型がなんであろうと、書式で指定された型のほうを
優先してしまう。とうことだな。

unsigned int a = -50; については、負定数 -50 のビットパターンをそのまま unsigned int 型変数に格
納している。だからキャストなどしない限り、a は符号なし整数であり、式の中でも負数とはみなされない。

問題の例では、たまたまprintfが、変数型を見ていないから、負数として判断してくれただけ。