型は、型int
よりも数学的な整数の動作によく似ていますunsigned
。
unsigned
状況によって負の値を表す必要がないという理由だけで、型を好むのは単純です。
問題は、unsigned
タイプがゼロのすぐ隣で不連続な動作をすることです。小さな負の値を計算しようとする操作は、代わりに大きな正の値を生成します。(さらに悪いことに、実装定義のものです。)
そのような代数関係は、とのような小さな値であっても、 が符号なしドメインで壊れていることをa < b
意味します。a - b < 0
a = 3
b = 4
のような下降ループは、無署名for (i = max - 1; i >= 0; i--)
にすると終了しませんi
。
符号なしの癖は、そのコードが正の量のみを表すことを期待しているかどうかに関係なく、コードに影響を与える問題を引き起こす可能性があります。
符号なし型の利点は、符号付き型のビット レベルで移植可能に定義されていない特定の操作が、符号なし型の場合に移植可能であることです。unsigned 型には符号ビットがないため、符号ビットによるシフトとマスキングは問題になりません。unsigned 型は、ビットマスク、およびプラットフォームに依存しない方法で正確な演算を実装するコードに適しています。符号なし操作は、非 2 の補数マシンでも 2 の補数セマンティクスをシミュレートします。多倍精度 (bignum) ライブラリを作成するには、符号付きの型ではなく、符号なしの型の配列を表現に使用する必要があります。
The unsigned types are also suitable in situations in which numbers behave like identifiers and not as arithmetic types. For instance, an IPv4 address can be represented in a 32 bit unsigned type. You wouldn't add together IPv4 addresses.