C ++では、プリミティブを作成できますunsigned
。しかし、彼らは常に前向きです。符号なしの負の変数を作成する方法もありますか?unsignedという単語は「符号なし」を意味するので、マイナス(-)記号でもありません。しかし、C++がそれを提供しなければならないと思います。
5 に答える
いいえunsigned
、負でない数のみを含めることができます。
負の数のみを表す型が必要な場合は、自分でクラスを作成するか、プログラムで値を負として解釈する必要があります。
(しかし、なぜそのようなタイプが必要なのですか?)
unsigned
整数は正のみです。2003 C ++標準の3.9.1段落3から:
符号付き整数型の非負値の範囲は、対応する符号なし整数型のサブ範囲であり、対応する各符号付き/符号なし型の値表現は同じでなければなりません。
符号なし整数型の主な目的は、モジュロ演算をサポートすることです。3.9.1段落4から:
符号なしで宣言された符号なし整数は、2 nを法とする算術の法則に従うものとします。ここで、nは、その特定のサイズの整数の値表現のビット数です。
もちろん、必要に応じてそれらをネガティブとして扱うことは自由です。何らかの方法で(おそらくブールフラグを使用して)自分でそれを追跡する必要があります。
あなたはそれを間違った方法で考えていると思います。
負の数が必要な場合は、変数を符号なしとして宣言しないでください。
問題が値の範囲であり、もう1ビットが必要な場合は、「より大きな」データ型(たとえば、int 64 ...)を使用できます。
次に、レガシーコードを使用している場合、新しい構造体を作成することで問題を解決できますが、特定の状況のため、C++はそれを処理しないはずです。
名前に騙されないでください。unsignedは非負と誤解されることがよくありますが、言語の規則は異なります...おそらくより適切な名前は「bitmask」または「modulo_integer」でした。
unsignedが非負であると考える場合、たとえば、暗黙の変換ルールはまったくナンセンスです(2つの非負の差が非負である必要があるのはなぜですか?非負と整数の加算が非負である必要があるのはなぜですか? ?)。
たとえば、vector.size()が符号なしであるため、C ++標準ライブラリ自体がその誤解に陥ったことは非常に残念です(言語自体がビットマスクまたはmodulo_integerに関して行うように、それを意味する場合はばかげています)。このサイズの選択は、unsigned-nessよりも古い16ビット時間と関係があり、私たちがまだバグとして支払っているのはひどい選択だったと思います。
しかし、C++がそれを提供しなければならないと思います。
なんで?C ++は、非負の数を負にする機能を提供する必要があると思いますか?それはばかげています。
C ++の符号なし値は、常に非負になるように定義されています。それらは、ゼロで、アンダーフローではなく、ラップアラウンドさえします!(そして範囲の反対側でも同じです)