質問

これらはCおよびC ++のコンテキストで言及されていますが、符号付き変数と符号なし変数の違いは何ですか?

役に立ちましたか?

解決

符号付き整数などの符号付き変数を使用すると、正と負の両方の範囲で数値を表現できます。

符号なし整数などの符号なし変数では、正の数値のみを表現できます

同じタイプの符号なし変数と符号付き変数(intbyteなど)は両方とも同じ範囲(それぞれ65,536および256の数値の範囲)を持っていますが、 unsignedはより大きな大きさの数値を表すことができます対応する署名付き変数

たとえば、unsigned byte0から255の値を表すことができ、signed byte-128から127を表すことができます。

署名された数値表現は、ビットレベルでの表現の違いを説明しています。 整数(コンピューターサイエンス)ページは、各符号付き/符号なし整数の範囲の表を提供しますタイプ。

他のヒント

一般に「符号ビット」と呼ばれますが、通常使用するバイナリ値には真の符号ビットはありません。

ほとんどのコンピューターは2の補数演算を使用します。負の数は、1の補数(すべてのビットを反転)を取り、1を追加することで作成されます。

<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; 5 (decimal) -> 00000101 (binary)
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; 1's complement: 11111010
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; add 1: 11111011 which is 'FB' in hex


これが、符号付きバイトが-127〜+127ではなく-128〜+127の値を保持する理由です。

<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; 1 0 0 0 0 0 0 0 = -128
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; 1 0 0 0 0 0 0 1 = -127
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; ---
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; 1 1 1 1 1 1 1 0 = -2
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; 1 1 1 1 1 1 1 1 = -1
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; 0 0 0 0 0 0 0 0 = 0
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; 0 0 0 0 0 0 0 1 = 1
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; 0 0 0 0 0 0 1 0 = 2
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; ---
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; 0 1 1 1 1 1 1 0 = 126
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; 0 1 1 1 1 1 1 1 = 127
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp;(127に1を加えると次のようになります)
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; 1 0 0 0 0 0 0 0 <!> nbsp; <!> nbsp; <!> nbsp;このチャートの上部にある-128です。


適切な符号ビットがあれば、1ビットが符号用に予約されているため、値の範囲は同じになります(例:-127〜+127)。最上位ビットが符号ビットである場合、次のようになります。

<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; -5 (decimal) -> 10000101 (binary)
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; 0 (decimal) -> 00000000 (binary)

この場合の興味深い点は、ゼロと負のゼロの両方があることです。
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; -0 (decimal) -> 10000000 (binary)
<!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <!> nbsp; <=>


2の補数の-0はありません。 -0になるのは-128(またはより一般的には、最大の正の値よりも1つ大きい)です。ただし、補数を使用します。 1ビットはすべて負の0です。

数学的には、-0は0に相当します。-0 <!> lt; 0、しかし、私はそれへの参照を今見つけることができません。

符号付き変数は、1ビットを使用して、正または負のどちらであるかを示します。符号なしの変数にはこのビットがないため、同じスペースに大きな数値を格納できますが、非負の数値のみを格納できます。 0以上。

その他:符号なしおよび符号付き整数

符号なしの変数は、負であることを示すことができないため、正の数値のみにすることができます。

この機能は「署名」または「署名ビット」と呼ばれます。

副作用は、署名ビットなしで、数値を表すために使用できるもう1つのビットがあり、表現できる最大数を2倍にすることです。

署名された変数は、0、正または負です。

符号なし変数は0または正の値です。

実際の値を表すためにより多くのビットを使用できるため、符号なし変数が使用されることがあります。より広い範囲を提供します。また、たとえば、負の値が関数に渡されないようにすることができます。

unsignedは、ur値が正である必要がある場合に使用され、ここでは負の値はありません。 int範囲-32768〜+32767で署名されている場合 0から65535までの整数範囲で符号なしの場合

符号なし変数は、数学記号(プラスまたはマイナス)なしで内部的に表される変数です。「ゼロ」または正の値のみを保存できます。符号なし変数のサイズが nビットで、2 ^ n(2乗n)の値-0から(2 ^ n -1)を表すことができるとしましょう。一方、符号付き変数は、符号を表すために1ビットを「失う」ため、ゼロを含む-(2 ^(n-1)-1)から(2 ^(n-1))までの値を格納できます。したがって、署名された変数は、正の値、負の値、およびゼロを保存できます。

PS:
内部的に、数学記号は、1の補数形式、2の補数形式、または符号ビットで表すことができます(例:0-<!> gt; +、1-<!> gt;-)
これらのすべての方法は、nビット(2 ^ n)で表現可能な値の範囲を3つの部分(正、負、ゼロ)に効果的に分割します。

これはちょうど2セントの価値があります。

これが役立つことを願っています。

これは正確な定義ではないかもしれませんが、例を挙げます。 システム時刻から乱数を取得して乱数を作成する場合、符号付きの数値は正と負の両方の数値を与えるため、乱数の範囲が広いため、ここで符号なし変数を使用すると便利です。システム時間を負にすることはできないため、符号なし変数(正の数のみ)を使用し、より幅広い乱数を用意しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top