0

16 ビット システムで 1101 0010 0010 0010 を取得し、それを 10 進数に変換したい場合、結果は -11,742 になります (先生が教えてくれました)。

しかし、電卓に 2 進数を入力すると、53794 になります。

これはなぜですか?システム (8 ビット、16 ビット、32 ビット、64 ビット) はこれにどのように影響しますか?

手で2進数を変換しようとしました(2 + 32 + 512 + 4096 + 16384 + 32768 = 53794)が、電卓を確認するためだけです....

4

5 に答える 5

1

それは、コンピューターの算術が2 の補数に基づいているためです。

あなたはColpementの方法について読むべきです

たとえば、10 進数の補数では、自然な減算は次のようになります (4 桁を使用):

0000
0001 -
9999 =

補数システムでは最初の桁(もちろんビッグエンディアンでは、エンディアンに精通している必要があります)が符号を定義するため、明らかに-1です。たとえば、10 進数の補数では、4 は 4、4 は 4、3 は 3、2 は 2、1 は 1、0 は 0、9 は -1、8 は -2、7 は -3、6 は -4、5 です。は -5 です。

これは、補数システムでは、常に同じ桁数で操作しますが、オーバーフローした結果を無視することを除いて、常に加算と減算を行っているためです。たとえば、10 進数が 2 桁の場合:

      04
      05 -
 ...9999 =

私が言ったように、結果は 2 桁しかない (2 桁を追加した) ため、結果は 99 です。前にも述べたように、最初の数値は (9 ではなく) -1 として解釈されます。これは位置番号システムであるため、この結果を通常の 10 進法に簡単に変換できます。正しい 10 の累乗で乗算する数字を合計するだけです。

10^1 * 9 + 10^0 * 9
//as I told - first nine is -1 so:
10^1 * -1 + 10^0*9 = -10 + 9 = -1

最初の結果で試してください:

9999 = 9 * 10^3 + 10^2 * 9 + 10^1 * 9 + 10^0 * 9
//first nine is -1 so:
-1 * 10^3 + 999 = -1000 + 999 = -1

バイナリでは、最初の数値が符号が何であるかを示すだけなので、はるかに簡単です。8ビットの数値で試してください:

1111 1111

1 を足すと結果が 0 になるので、明らかに -1 です。

  1111 1111
  0000 0001 +
1 0000 0000 =

しかし、補体系では正しくありません。それは、補体系では最初の桁が数の符号を記述するだけでなく、すべての数がその桁によって無限に拡張できるからです! これが、id が 10 進数 99 = 9999 を補う理由です。また、8 バイトの数値をたとえば 32 バイトに簡単に拡張できることも意味します。

たとえば、数字の 17 と -1 を試してみてください。あなたは今、-1 に精通しています。8 バイトの 2 の複素数 -1 は次のとおりです。

1111 1111

32 バイトに拡張すると、次のようになります。

1111 1111 1111 1111 1111 1111 1111 1111

それを通常の 10 進法に変換するには、2^31 + 2^30 + ... + 2^0 を実行する必要がありますが、(前述したように) 最初の 1 は -1 なので、正確には -1 * 2^31 + 2^30 です。 + .. + 2^0 これを計算すると、正確には -2147483648 + 2147483647 = -1 !

0001 0001 (10 進数 17)

32 バイトに拡張すると、次のようになります。

0000 0000 0000 0000 0000 0000 0001 0001

そして、まだ17歳であることは同意できます:)

私が頭がおかしいわけではなく、IT の学生であることを示すために、まさにそのようなことを行う C++ コードを紹介します。

#include <iostream>
using namespace std;
int main(void)
{
    char eightBits = 255; //eightBits := 0x11111111
    int eightBytes = eightBits; //eightBytes becaming 255, right?
    cout <<eightBytes <<endl; // MAGIC ! 
    return 0;
}
于 2013-08-26T18:15:43.893 に答える
0

コンピュータでは、左端のビットが無限回複製されると仮定して「2 の補数」の符号付き数値を表現するのが一般的です。したがって、ビット シーケンス (1101 0010 0010 0010) は (1111....1111 1101) と見なされます。 0010 0010 0010)。1 の無限の文字列は無限に大きい数のように見えるかもしれませんが、そのような文字列に 1 を追加すると、ゼロの無限の文字列 (つまり 0) が生成されます。したがって、1 の無限ストリングは 1 の加算逆数であるため、有効値は -1 です。1 の無限の文字列の後にいくつかのゼロが続く場合、単一の 1 の後にその数のゼロが続く加算的な逆になります (したがって、この例では、左端の「1」の有効値は +32768 ではなく -32768 になります)。 . ベキ級数の公式を 1+2+4+8+16+32+64 に適用すると...

2 の補数演算の多くの説明では、最上位ビットの「スケーリング係数」の符号が反転されている (たとえば、+32768 ではなく -32768) と単純に説明されていますが、左端ビットのコピーによる左パディングの観点から考えると、符号付きの数値が左端の数値が重複しているように振る舞う理由を理解するため (たとえば、負の 16 ビット整数を 32 ビット整数に変換すると、左端の 16 ビットが 1 で埋められます)。

于 2013-08-26T17:58:49.787 に答える
0

ここでの暗黙のビットは、サインに関するものです。フロントエンドに格納され、記号を示します。

http://www.binaryconvert.com/result_signed_short.html?decimal=04504904905505205​​0

より簡潔に言うと、16 ビットの「ワード」または整数は通常、ほとんどのシステムで「ショート」と呼ばれ、-32,768 から +32,767 までの符号付き数値を表します。これは、教師が参照している「2 進数」であり、2 進数として直接保存されるのではなく、2 進数形式で保存されます。実際には、値を格納するスポットは 15 箇所しかなく、1 箇所は符号用に予約する必要があります。それ以外の場合、符号なしの値は 16 個のスポットすべてを数値に使用できるため、0 から +65,535 までの範囲になる可能性があります。

于 2013-08-26T17:36:51.140 に答える