web-dev-qa-db-ja.com

2進整数が負の数を表すかどうかを知る方法は?

Cのテキストを読んでいます。負の値と正の値のセッションで、著者は負の数をバイナリ形式で表すいくつかの方法について述べました。

私はすべての方法を理解し、与えられた2進数で、それが負であるかどうかを判断できますか?

たとえば、-92は8ビットのバイナリ形式です:10100100。しかし、10100100それは-92であり、他の負でない数ではないと言えるでしょうか?

22
ipkiss

もちろん、それは表現に依存します。広く使用されている2の補数では、単に最上位ビットを調べます。

19
Tom Zych

たとえば、(数値)-92のバイナリ形式は10100100(8ビットのバイト表現)です。しかし、10100100が与えられた場合、それは-92であり、他の負でない数ではないと言えるでしょうか?

いいえ、事前に署名付きまたは署名なしの表現/規則が使用されているかどうかを知る必要があります。署名されていることがわかっている場合でも、数値を格納するために使用される encoding も知っておく必要があります。 。

8ビット整数(つまりバイト)が署名されている場合、トムと32ビットキッドのように、通常、符号付き整数は 2の補数 に格納されます。ここで 最上位ビット(MSB) =は、数値が負かどうかを決定します。

例えばあなたの例では、バイト10100100signed byte-92を表す可能性があります。

MSB : 1 means negative
Other 7 Bits 0100100 
Flip and add 1 => 1011011 + 1 = 1011100
From powers of two, right to left : 
0*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + 1*2^4 + 0*2^5 + 1*2^6
= 4 + 8 + 16 + 64 
= 92 (and thus -92 because of the MSB)

または、値がnsigned byteの場合、MSBはすべての下位ビットと同じ、2の次の累乗として扱われます

つまり、10100100は以下を表すことができます。

4 + 32 + 128 
= 164

(再び、2の累乗、右から左、および0 2の累乗を省略)

整数に符号を付けるかどうかの決定、および必要なビット数は、通常、整数に格納する必要がある値の範囲によって決まります。たとえば、32ビットの符号付き整数は範囲を表すことができます。

–2147483648 to 2147483647

符号なし32ビット整数は、

0 to 4294967295
16
StuartLC

2の補数 の数値を読みたい。つまり、最上位ビットを使用して、数値が負かどうかを判断できます。

私はあなたの質問を読み直しました、そしてあなたはあなたがすでに2の補数を理解していると言いました。負の数を処理する場合、その数が負であるかどうかを判断するためにビット数を知る必要があります。負の数は、必要なビット数に符号拡張する必要があります。 32ビットで保存された場合の-92の例は、11111111111111111111111110100100になります。

6
bw1024

メモリに値がある場合は、同じサイズの符号付きにキャストし、ゼロ未満かどうかをテストします。したがって、if ((int)value < 0)です。

文字列からバイナリ定数を解析する場合は、数値の形式を知っている必要があります。しかし、2の補数は50年間普遍的でした。 (1つの例外は、現在も使用されている特定の古いUnisysメインフレームのバイナリ互換サポートです。)そのためには、最初のビットを確認するだけです(受け入れられた回答が示すとおり)。

0
Davislor

負の数/正の数を決定するには、数値のタイプ(符号付き/符号なし)を知っている必要があります。タイプが指定されていない場合、デフォルトで署名されます。署名されている場合は、MSBビットを調べて、正または負のnoを判別できます。符号なしと記載されている場合は、MSBビットをカウントして10進数をnoにする必要があります。

0
user3427258