2016-10-13 10 views
3

4ビット演算を扱っているとします。だから私が2進数字に遭遇すると、負の2進数を区別する方法は?

1111 

私は何を推論すればよいですか?それは-1か15か? "依存"

+3

それは形式に依存しますが、それは2の補数だ場合、それはだ-1。 (1の補数の場合は-0、符号+振幅の場合は-7、オフセットバイナリの場合は+7)。 –

+0

*コンテキスト*によって異なります。強力なCPUでもその兆候は分かりません。あなたは適切な指示を使用します。 –

+1

あなたの質問はCに関するものなので、バイナリ数字のシーケンスだけではありません。おそらく、特定の* type *の* object *に* value *が格納されているでしょう。 (そして、そのオブジェクトはビットフィールドでない限り、4ビットよりも大きいです。)あなたがその4ビットをどのような形で正確に説明することができれば、疑問は自分自身に答える可能性があります。そうであるように、あなたはあなたの質問にCについて何も言わない。質問を更新して、使用しているCコードを表示できますか? –

答えて

2

ビット数を符号化する(この場合)ですが、あなたは、符号化ビットを解釈するために番号(符号付きまたは符号なし整数、固定小数点または浮動小数点)のどのようなものを知っている必要があります。

数が、それは符号なしだならば、それはそれだけでは、これらの4ビットから決定することはできません15.

だ、その後、適切な解釈が-1で、2の補数に調印することになっている場合、それは単に十分ではありません情報。

これはもちろん、「フルサイズ」の値にも当てはまりますが、intまたはunsigned intになる可能性があります。ビットを正しく解釈するには、そのことを知る必要があります。

更新:あなたがあなたの番号が署名することになっているを知っ場合は、それに対処する最も簡単な方法(一般的に署名した4ビットの整数型を持っていないCを、仮定は)にあります記号をに拡張して使用可能な形式にします。

符号拡張は、単に、より少ないビット数の最上位ビットを取って、そしてまで左(を含む)ターゲット一方の最上位ビットにそれを繰り返すことを含みます。

だからあなたの場合には、あなたがその最上位ビットが1 int8_tに拡張され0xfを、持っている、我々が得る:

const int8_t number = 0xff; 

はどれ-1。 Cは、ネイティブにそれらに対処することはできませんので、

は、任意のいくつかのビット数から、この符号拡張を行うには、組み込みの方法はありません。ここで

は単純なアプローチです:

// Sign-extend a n-bit number into 32 bits. 
int32_t extend(uint32_t bits, size_t n) 
{ 
    const bool top = bits & ((uint32_t) 1 << (n - 1)); 
    if (top) 
    { 
    for (size_t i = n; i < 32; ++i) 
     bits |= 1 << i; 
    } 
    return bits; 
} 

あなたの番号で上記を呼び出す場合:

printf("%d\n", (int) extend(0xf, 4)); 

それは-1を印刷します。

+0

@ryykerいいえ、ナンバーの幅は問題ではありません。「2ビットの数字を扱っていますが、「11」は何ですか?または "私は16ビットの数字を扱っています、何が' 1111111111111111'ですか? "私はあなたの2番目の見積もりの​​テキストを理解していません。 – unwind

関連する問題