>>162
cがcharのときはprintfに渡すときはintに格上げされる。
0x0000ffはcharに入れたときは10進で-1だから、
intに格上げされたときの-1の値が入る。それが0xffffffffだ。

# fが2個足りないんじゃないか?

cがunsigned charのときは0x0000ffは10進で255だ。
それがintに格上げされたとして255の値が入る。
そいつは16進で0xffだ。お望みの通りの結果になる。

なぜcharやunsigned charがintに格上げになるのかは、
まあそういう規則だからと思っておけ。
詳しくは関数のプロトタイプの解説をどっかで見つけて読めばいいと思う。