17

私は子供たち(9歳から13歳)にプログラミングについて教えるためのチュートリアルを書いています。私はコンピューター自体から始めました。コンピューターサイエンスとはあまり関係がありません。それは、計算問題の解決に関連するプロセスに関するものです。

その出発点で、私は機械が特定の計算問題で私たちを助けることができるという理解に向けて彼らを導きます。人々は抽象的な思考と想像力に長けていますが、コンピューターは明確に指定されたルーチンに従うのに優れています。彼らは驚くべきスピードで何度も何度もそれを行うことができます!

バイナリ形式での数値の表現については、私のチュートリアルですでに説明しています。しかし、負の数をどのように表現しますか?これを行う方法は、どの表記法でも非常に多くありますが、コンピューター用に選択されたシステムは、非常に特殊な理由からです。符号付き整数値の追加に関連する機械の量を減らすためです。負の数を処理するためだけに個別のチップを作成して構築する必要はありません。自然数の演算に使用していたのと同じチップを使用したいと思います。

誰かが路上であなたに尋ねた場合(これは完全に非現実的です)、「コンピューターはどのように負の数を表し、なぜそれらはこのように表すのですか?」

私の具体的な質問:

  1. コンピューターはどのように負の数を表しますか?

  2. なぜコンピューターはこのように負の数を表すのですか?

この多くの経験豊富な開発者は、これについて少し考えなければならないと思います。答えを思い付くことができない人もいるかもしれません。私は派手になろうとはしていません。これは実際の経験によるものです。プロの開発者にこの質問をしましたが、彼らはそれに答えることができません。彼らは空白の凝視を描きます。それらにJBossとJavaBeansを与えると、彼らは自信を持ってあなたをスチームロールします。とても面白い!私もこの質問に苦労しています。毎回答えを思い出さなければなりません。解決策を見つけるには、紙またはホワイトボードが必要です。私が望んでいるのは、生徒が使用している機械をよりよく理解できるように指導することです。

4

6 に答える 6

30

1.コンピューターはどのように負の数を表しますか?

正の値を取り、すべてのビットを反転して1つ追加します。

2.なぜコンピューターはこのように負の数を表すのですか?

-7に7を追加するのは簡単で、ゼロを考え出しました。ビット演算は高速です。


どうすれば簡単にできますか?

7と-7の例を見てください。7をとして表す場合00000111、-7を見つけるには、すべてのビットを反転して1つ追加します。

11111000 -> 11111001

これで、次の標準的な数学ルールを追加できます。

  00000111
+ 11111001
-----------
  00000000

コンピュータの場合、基本的にビットごとに比較して1つ運ぶ必要があるため、この操作は比較的簡単です。

代わりに-7をとして表現した場合10000111、これは意味がありません。

  00000111
+ 10000111
-----------
  10001110 (-14)

それらを追加するには、最初のビットの分析や値の変換など、より複雑なルールを使用します。

また、@ trashgodが言ったことを忘れないでください。2の補数では、ゼロは1つだけです。確認するには:

00000000
11111111(すべてのビットを反転)
00000000(1つ追加)

00000000010000000 )が(-0)に等しいのとは異なります

于 2011-07-28T02:37:52.823 に答える
6

コンピューターはどのように負の数を表しますか?

コンピューターは、通常の減算規則を使用して、ゼロからその数を減算した場合に得られる結果を計算することにより、負の数を表します。つまり、バイナリでどのように見えるかを見つけるには、(バイナリで)から(バイナリで)-5を減算します。50

0  0  0  0 -
0  1  0  1
----------

              (borrow)
-> 1 -> 1 -> 1 ->10 -
   0    1    0    1
   ----------------
   1    0    1    1

..soはバイナリ-5のよう1011に見えます。

なぜコンピューターはこのように負の数を表すのですか?

このようにすることは、コンピューターが数値を加算および減算するときに、それらの一部が負であるかどうかをチェックする必要がないことを意味するため、とにかく数学はうまくいきます。これにより、コンピューターがよりシンプルになり、よりシンプルなコンピューターの方が安価に構築できます。

于 2011-07-28T02:40:44.933 に答える
6

なぜコンピューターはこのように負の数を表すのですか?

私が考えることができる2つの大きな理由:

  • 基本的な算術演算の単純さ。加算するか減算するかを決定するために符号ビットを調べることを心配する必要はありません。
  • 表現の独自性。2の補数で負のゼロを表す方法がないため、負のゼロについて心配する必要がないのは良いことです。

ウィキペディアから:

2の補数システムには、加算および減算回路がオペランドの符号を調べて、加算するか減算するかを決定する必要がないという利点があります。このプロパティにより、システムの実装が簡単になり、より高精度の演算を簡単に処理できるようになります。また、ゼロには1つの表現しかないため、1の補数システムに存在する負のゼロに関連する微妙な点がなくなります。

于 2011-07-28T02:40:48.033 に答える
3

数直線を書き留めます

-32768 ... -1、0、1、2、... 32767

右に移動を追加します。減算は左に移動します。概念的には素晴らしいですが、どのようにサインを表現できますか?

符号と値が分離している「符号付きの大きさ」を使用できます。符号が異なる2本の平行な数直線があるため、これは混乱を招きます。

「符号付きの大きさ」の代わりに、各数値を別の数値としてエンコードすることもできます。

すべての数値に32768のオフセットを追加できます。新しい範囲はunsigned0〜65535です。すべてが機能しますよね?すべての数値に固定バイアス値が適用されているだけです。右に移動を追加します。減算は左に移動します。32768は0にデコードできます。0は-32768にデコードできます。

これは完全に機能します。数値の「エンコード」は、単にバイアスを追加することです。数値を「デコード」すると、バイアスが差し引かれます。

これが別のエンコード方式です。

すべての負の数を数直線の反対側に運びます。

0、1、2、...、32767、-32768、... -1

加算はまだ右に移動します。任意の数を取ります(1つの例外を除く)。その右側の数字は常に大きくなります。

唯一の例外は32767です。その右側の数字は「オーバーフロー」です。

減算はまだ左に移動します。任意の数を取ります(1つの例外を除く)。左側の数字は常に小さくなっています。唯一の例外は-32768です。その左側の数字は「アンダーフロー」です。

エンコードとデコードはもう少し複雑です。0から32767には、簡単なエンコードとデコードがあります。何もしません。番号はそれ自体としてエンコードされます。ただし、32768〜65535は負の数のエンコーディングです。

于 2011-07-28T03:00:23.510 に答える
1

Twoの補数は、1つのハードウェアユニットで実行できる1つの操作への加算と減算を簡略化するために使用されます。ある数値を別の数値から減算する代わりに、2の補数演算では、ある数値の逆数を別の数値に加算します。昔は、数値を引くためのハードウェアを別に持っていたのはかなり大変だったので、1つのユニットで減算と加算を実行するシステムを考え出すことは非常に役に立ちました。

ビットを反転して1を追加することにより、2の補数の任意の数の逆数を見つけることができます。たとえば-1、4ビットの実装では次のように表されます。

 1: 0001
-1: 1110 + 1 = 1111

これは、次の2つを追加することで確認できます。

 0001 + 1111 = 10000

ただし、4ビットで作業しているため、結果は切り捨てられます。現在、、0000またはがあり0ます。数値とその負数を追加し、ゼロになりました。やあ!

ここで、最後の例として、4〜6を実行してみましょう。4はとして表され0100ます。6はとして表され0110ます。-6を取得するには、ビットを反転して1つ追加します1001 + 1 = 10100100 + 1010 = 11101110は負の数です(1最上位桁にaが含まれるすべての数は、2の補数では負です)。その絶対値を見つけるために、ビットを反転して1 0001 + 1 = 0010、または2を加算します。したがって、加算の結果はです-24 - 6 -2。私たちの数学はチェックアウトします。

おめでとう。これで、コンピューターとまったく同じくらい賢くなりました。

于 2011-07-28T02:49:39.263 に答える
0

Q1。コンピューターはどのように負の数を表しますか?

2の褒め言葉!

Q2。なぜコンピューターはこのように負の数を表すのですか?

2の褒め言葉は次のように機能します。

任意のxについて、

x + ~x   = all the bits set  
x + ~x   = 2^m - 1      (2^m = the range of numbers we opt)  
  -x     = ~x + 1 - 2^m (we can cancel out mod 2^m, which gives)  
  -x     = ~x + 1 

ご覧のとおり、2の補完は論理的で実装が簡単で、コーナーケースがないため、他の方法よりも優先されます。1の補数、私が話していたコーナーケースを使用した方法を
考えてみましょう。ここでは、0と-0が存在し(すべてのビットが設定されていない= 0、すべてのビットが設定されている= -0)、特にハードウェア回路に対して実行する操作が増えます。数値xおよび-0の操作中。[ウィキペディアには、負のゼロの回避に関する優れた例があります。それらを見ることができます]

この説明があなたの子供たちの心を落ち着かせることを願っています...

于 2015-11-03T13:10:33.217 に答える