uint を使用する理由は、コンパイラにさまざまな最適化を提供するためです。たとえば、x が正であることがわかっている場合は、'abs(x)' のインスタンスを 'x' に置き換えることができます。また、正の数に対してのみ機能するさまざまなビット単位の「強度削減」も可能になります。int を常に 2 のべき乗で乗算/除算する場合、コンパイラは演算をビット シフト (つまり、x*8 == x<<3) に置き換えることができ、実行速度が大幅に向上します。残念ながら、この関係は「x」が正の場合にのみ成立します。これは、負の数がこれを排除する方法でエンコードされているためです。int の場合、値が常に正であることを証明できる場合 (またはコードの前の方で正の値になるように変更できる場合)、コンパイラはこのトリックを適用できます。uint の場合、この属性は簡単に証明できます。
別の例として、式がありますy = 16 * x + 12
。x が負になる可能性がある場合は、乗算と加算が必要になります。ただし、x が常に正の場合、x*16 項を x<<4 に置き換えることができるだけでなく、項は常に 4 つのゼロで終わるため、「+ 12」をバイナリ OR に置き換えることができます (限り「12」項は 16 未満であるため)。結果は になりますy = (x<<4) | 12
。
一般に、「unsigned」修飾子は、変数に関するより多くの情報をコンパイラに提供します。これにより、コンパイラはより多くの最適化を行うことができます。