上記のプログラムなんですが良く分からない所があります。 
まず1の補数はビットの反転ですよね?そもそも処理系によって補数って変わるんじゃないんですか? 
0の補数は11111~となるけど、-1が1111・・・0だから1111・・1の数、つまり0に対する1の補数って存在 
しないんじゃないんですか?そもそも1の補数か2の補数でビットが表現されてるのか処理系によって違う 
んじゃないんですか? 
後なんでmain関数内のscanfの書式が%uなのでしょうか?%dじゃないのでしょうか? 
%uは型の大きさのときにこう指定するのであって、実際にint型の数を関数にわたすわけ 
だから%dなのではないのでしょうか?