5

(私の質問は2の補数のみに関連しています)

2 の補数としてマシンに格納されているこの 2 進数 11111110 をあなたに渡し、それに相当する 10 進数を見つけてほしいとします。-2 と言う人もいれば、署名付きか未署名かがわからないので 254 と言う人もいます。(私はそれが符号付きの数であることを知っているので、その補数を取って 1 を追加すると 2 が得られたので、答えは -2 です。しかし、符号がわからなかったら、254 と答えていたでしょう)。

要するに、コンピューターはどのようにして 2 の補数で格納されている 2 進数表現を、間違いなく 10 進数に変換するのでしょうか?

コンピュータはそのサインを知っていますか? (はいの場合、この情報はどこに保存されますか?)

4

2 に答える 2

11

コンピュータには 10 進数を表すためのストレージ機能がないため、技術的には 2 進数を 10 進数に変換することはできません。

実際には、これはばかげているように聞こえるかもしれません。しかし、これらの 10 進数表現が実際に 10 進数で格納されることはありません。コンピュータが行う唯一のことは、数値を表示するときに数値を 10 進表現に変換することです。そして、この変換は、プログラムの構築とライブラリの設計に関連しています。

C言語の小さな例を挙げます。C では、符号付きおよび符号なしの整数変数があります。プログラムを書いているとき、これらの変数は数値をメモリに格納するために使用されます。彼らの兆候について誰が知っていますか?コンパイラ。アセンブリ言語には、符号付き演算と符号なし演算があります。コンパイラはすべての変数の符号を追跡し、符号付きおよび符号なしの場合に適切なコードを生成します。したがって、プログラムは、コンパイル時に符号付きまたは符号なしの整数を完全に処理します。

センテンスを使用しprintfて整数変数を出力し、%dフォーマット コンバーターを使用して値を 10 進表現で出力したとします。この変換はprintf、C の標準入出力ライブラリで定義されている関数によって処理されます。この関数は、変数をメモリから読み取り、単純な基数変換アルゴリズムを使用して 2 進数表現を 10 進数表現に変換します。しかし、アルゴリズムのターゲットは整数ではなく文字シーケンスです。したがって、このアルゴリズムは 2 つのことを行います。どちらも 2 進数から 10 進数への変換です。ビットを char 値 (より正確には ASCII コード) に変換します。printf変換を正常に実行するには、数値の符号を知っている必要があります。この情報は、コンパイル時に配置されたコンパイラ構造によって再び提供されます。これらの構造を使用するprintfことで、整数が符号付きか符号なしかをチェックし、適切な変換方法を使用できます。

他のプログラミング言語も同様の道をたどります。基本的に、数値は常に 2 進数で格納されます。符号付きまたは符号なしの表現は、コンパイラ/インタプリタによって認識されているため、一般的な知識です。10 進変換は見た目上の理由でのみ実行され、変換の対象は文字列または文字列です。

于 2013-03-28T09:19:02.677 に答える
0

これは、符号付きの数値を使用するように指定すると、コンピューターは最初のビット[1]1111110を、残りのビットから作成された数値の符号として解釈するため1[1111110]です。したがって、1 は - を意味し、0 は + を意味します。「char」には -127 から 127 までの数値を格納できます。「unsigned char」には 0 から 255 までの数値を格納できます。

于 2014-02-24T16:33:54.657 に答える