web-dev-qa-db-ja.com

符号付き変数と符号なし変数の違いは何ですか?

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

61
Sam152

符号付き整数などの符号付き変数により、正と負の両方の範囲の数値を表すことができます

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

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

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

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

119
coobird

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

ほとんどのコンピューターは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のコンピューターを漠然と覚えていますが、今はそれを参照できません。

41
Alan Jay Weiner

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

詳細: 符号なしおよび符号付き整数

18
Chris Hynes

符号付き変数は0、正または負のいずれかです。

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

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

3
Brian R. Bondy

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

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

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

3
thomasrutter

int範囲が-32768〜+32767の場合、urの値が正でなければならないときに符号なしが使用されます。int範囲が0〜65535の場合は符号なし

2
manish modi

符号なし変数は、数学記号(プラスまたはマイナス)なしで内部的に表される変数です「ゼロ」または正の値のみを格納できます。符号なし変数のサイズが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セントの価値です。

これがお役に立てば幸いです。

0
batbrat