2016-10-13 16 views
0

2進数が符号付き整数か符号なし整数かをI /コンピュータがどのように伝えることができますか? たとえば、2進数1000 0001は、符号付きの場合は-128、符号なしの場合は129と解釈できます。整数が署名されているかどうかを確認するには?

Cのような言語で符号なし整数を使用する利点の1つは、符号を定義しないことで得られる余分なビットのために大きな整数を使用できることです。しかし、私には、最初のビットが符号を表すのか、それともその数の大きさを表すのかの一部分だけを追跡する何かが、どこかで必要であると思われます。

+0

"最初のビットが符号を表すのか、それとも数の大きさを表すのかの一部であるかどうかは、どこかで必要です。あなたが使うタイプ? – tkausl

+0

数値のコレクションが1つではなく、上位ビットが設定されているときに2番目から上位のビットが設定されているかどうかを確認することができます。これは、値が署名されているが間違いがない。 –

答えて

1

メモリには、署名されていないか署名されているかどうかに関係なく、バイナリ表現が10000001として保存されます。メモリ内の数字を調べるだけで、2進数を符号付きまたは符号なしとして分類することは不可能です。この数字を署名なしまたは署名付きとして扱うべきかどうかを指示する指示が必要です。これはコンパイラが入る場所です。プログラマは、その番号を符号なしとして符号付きとして指定します。コンパイラは、書かれたコードを翻訳し、その番号に対する所望の命令を生成する。プログラミング言語によっては、これらの命令を生成する方法が異なる場合があります。覚えておくべき重要な点は、メモリ内の2進数に違いはなく、プログラマがどのようにしてこの数をコンパイラにどのように扱わせるかという点だけです。

0

可変型は、符号付きか符号なしかを追跡します。レジスタ内の実際の値では、その情報を格納するために余分なビットが必要になるため、あなたに伝えることはできません。署名されていない変換を警告する警告をオンにすることができます。また、署名されていない値を誤って署名した値に割り当てた場合、コンパイラはあなたに怒鳴ります。

1

コンピュータは記号について知る必要はありません。それは番号を印刷する方法です。算術演算はうまく動作し、符号付きか符号なしかは関係ありません。必要な長さにトリムされると、正しい結果が得られます。 8ビットに乗じ

例:

// negative times negative 
254 * 254    = 64516    // decimal unsigned - it's equal to 4 
((-2) * (-2))   = 4     // decimal signed 
1111 1110 * 1111 1110 = 1111 1100 0000 0100 // binary - 0000 0100 

// negative times positive 
254 * 2    = 508    // decimal unsigned - it's equal to (-4) 
-2 * 2    = -4     // decimal signed 
1111 1110 * 0000 0010 = 0000 0001 1111 1100 // binary - 1111 1100 

だから、それはあなたがJavaのような言語を使用している場合、それは符号なしの数の種類をサポートしていませんが、1111 1100を表すかはあなた次第です。

関連する問題