これらはCとC++のコンテキストで言及されていますが、符号付き変数と符号なし変数の違いは何ですか?
符号付き整数などの符号付き変数により、正と負の両方の範囲の数値を表すことができます 。
符号なし整数などの符号なし変数は、でのみ正数で数値を表すことができます。
同じタイプの符号なし変数と符号付き変数(int
やbyte
など)は両方とも同じ範囲(それぞれ65,536と256の数値の範囲)を持ちますが、unsignedは、対応する符号付き変数よりも大きい数値を表すことができます。
たとえば、unsigned byte
は0
から255
の値を表すことができ、signed byte
は-128
から127
を表すことができます。
符号付き数値表現 のウィキペディアページはビットレベルでの表現の違いを説明し、 整数(コンピューターサイエンス) ページは各符号付き/符号なし整数の範囲の表を提供しますタイプ。
一般に「符号ビット」と呼ばれますが、通常使用するバイナリ値には真の符号ビットはありません。
ほとんどのコンピューターは2の補数演算を使用します。負の数は、1の補数(すべてのビットを反転)を取り、1を加算することで作成されます。
5 (decimal) -> 00000101 (binary)
_1's complement: 11111010
_
_add 1: 11111011 which is 'FB' in hex
_
これが、符号付きバイトが-127〜+127ではなく-128〜+127の値を保持する理由です。
_1 0 0 0 0 0 0 0 = -128
_
_1 0 0 0 0 0 0 1 = -127
_
---
_1 1 1 1 1 1 1 0 = -2
_
_1 1 1 1 1 1 1 1 = -1
_
_0 0 0 0 0 0 0 0 = 0
_
_0 0 0 0 0 0 0 1 = 1
_
_0 0 0 0 0 0 1 0 = 2
_
---
_0 1 1 1 1 1 1 0 = 126
_
_0 1 1 1 1 1 1 1 = 127
_
(127に1を加えると次が得られます:)
_1 0 0 0 0 0 0 0
_このチャートの上部に表示されるのは-128です。
適切な符号ビットがある場合、1ビットが符号用に予約されているため、値の範囲は同じになります(例:-127〜+127)。最上位ビットが符号ビットである場合、次のようになります。
5 (decimal) -> 00000101 (binary)
-5 (decimal) -> 10000101 (binary)
この場合の興味深い点は、ゼロと負のゼロの両方があることです。0 (decimal) -> 00000000 (binary)
-0 (decimal) -> 10000000 (binary)
2の補数の-0はありません。 -0になるのは-128(より一般的には、最大の正の値より1つ大きい)です。ただし、補数を使用します。 1ビットはすべて負の0です。
数学的には、-0は0に等しくなります。-0 <0のコンピューターを漠然と覚えていますが、今はそれを参照できません。
符号付き変数は、1ビットを使用して、正または負のどちらであるかを示します。符号なしの変数にはこのビットがないため、同じスペースに大きな数値を格納できますが、非負の数値のみを格納できます。 0以上。
詳細: 符号なしおよび符号付き整数
符号付き変数は0、正または負のいずれかです。
符号なし変数は0または正の値です。
実際の値を表すためにより多くのビットを使用できるため、符号なし変数が使用される場合があります。より広い範囲を提供します。また、たとえば、負の値が関数に渡されないようにすることができます。
符号なしの変数は、負であることを示すことができないため、正の数値のみにすることができます。
この機能は「署名」または「署名ビット」と呼ばれます。
副作用は、署名ビットがない場合、数値を表すために使用できるもう1つのビットがあり、表現できる最大数が2倍になることです。
int範囲が-32768〜+32767の場合、urの値が正でなければならないときに符号なしが使用されます。int範囲が0〜65535の場合は符号なし
符号なし変数は、数学記号(プラスまたはマイナス)なしで内部的に表される変数です「ゼロ」または正の値のみを格納できます。符号なし変数のサイズがnビットである場合、2 ^ n(2乗n)値-0から(2 ^ n -1)を表すことができます。一方、符号付き変数は、符号を表すために1ビットを「失う」ため、ゼロを含む2 ^(n-1)-1)から(2 ^(n-1))までの値を格納できます。したがって、---(符号付き変数は正の値、負の値、ゼロを格納できます。
P.S.:
内部では、数学記号は1の補数形式、2の補数形式、または符号ビットで表すことができます(例:0-> +、1->-)
これらのすべての方法は、nビット(2 ^ n)で表現可能な値の範囲を3つの部分(正、負、ゼロ)に効果的に分割します。
これはちょうど私の2セントの価値です。
これがお役に立てば幸いです。