必要ない場合は unsigned int を使用する必要がありますか? 質問する

必要ない場合は unsigned int を使用する必要がありますか? 質問する

追加の値の範囲が必要ない場合、変数を unsigned int として宣言する必要がありますか? たとえば、for ループで変数を宣言するときに、負にならないことがわかっている場合、それは問題になりますか? どちらかが他方よりも高速ですか? C++ で unsigned int を unsigned として宣言するのは悪いことですか?

繰り返しますが、それはすべきでしょうか追加範囲が必要ない場合であっても? 混乱を招くので避けた方が良いと聞きました (確か、Java にそれがない理由です)。

ベストアンサー1

uint を使用する理由は、コンパイラに幅広い最適化を与えるからです。たとえば、x が正であることがわかっている場合、'abs(x)' のインスタンスを 'x' に置き換えることができます。また、正の数に対してのみ機能するさまざまなビット単位の '強度削減' が可能になります。常に int を 2 の累乗で乗算/除算する場合、コンパイラは操作をビット シフト (つまり x*8 == x<<3) に置き換え、パフォーマンスが大幅に向上する傾向があります。残念ながら、この関係は 'x' が正の場合にのみ成立します。負の数はこれを防ぐ方法でエンコードされるためです。int の場合、値が常に正であることを証明できる場合 (またはコードの早い段階で正になるように変更できる場合)、コンパイラはこのトリックを適用できます。uint の場合、この属性は簡単に証明できるため、適用される可能性が大幅に高まります。

もう 1 つの例としては、方程式 が挙げられますy = 16 * x + 12。 x が負になる可能性がある場合は、乗算と加算が必要になります。 しかし、 x が常に正である場合は、 x*16 項を x<<4 に置き換えることができるだけでなく、項が常に 4 つのゼロで終わるため、「+ 12」をバイナリ OR に置き換えることができます (「12」項が 16 未満である限り)。 結果は になりますy = (x<<4) | 12

一般に、「unsigned」修飾子は、変数に関する詳細な情報をコンパイラに提供し、その結果、より多くの最適化を行えるようになります。

おすすめ記事