Cの変数境界値

ARMのcharの型の話でふと思い出したのですが、こんな問題がありました。
int a,b,c; な変数があったとして、

if (a > b)
 〜

c = a - b;
if (c > 0)
 〜

の違いは何か?
別にintじゃなくてもshortでもcharでも構いませんが。
意識しておかないとバグの元になりそうだなーというお話。
ちなみにこの問題によるバグも一因となって、Linuxのrootがとれてしまうlocal exploitが作り込まれてしまったこともあります。