2016-05-17 2 views
2

私はバイナリの仕組みを理解しており、バイナリから10進までを計算することができますが、符号付きの数値の周りは失われています。 変換を行うcalculatorが見つかりました。しかし、私はどのように最大数と最小数を見つけるか、またはバイナリ数が与えられていない場合に変換するか分からず、StackOの質問は特定の数値の変換についてのものであるか、特定のビットに符号付き数値を含まないようです。符号付き数値を2の補数で5ビットで表現するための最大値と最小値は何ですか?

具体的な質問です:私はバイナリの概念に重く行く必要がありますよう

We have only 5 bits for representing signed numbers in two's complement: 

What is the highest signed integer? 
Write its decimal value (including the sign only if negative). 

What is the lowest signed integer? 
Write its decimal value (including the sign only if negative). 

はそう、私はプログラミングで2ヶ月を持っていると私は、バイナリ変換を知っていたと思いました。

答えて

5

論理的な観点から:署名された表現で

境界

あなたが5ビットを有するので、32の異なる組み合わせが存在します。つまり、5つの異なる32個の数字を作ることができます。符号なし整数の場合、5ビットに0〜31の整数を格納するのが理にかなっています。

しかし、これは約符号なし整数です。意味:負の数を表す方法も見つけなければなりません。意味:数字の値だけでなく、記号(+または - )も保存する必要があります。使用される表現は2の補数であり、どこでも学んだものです(おそらく他にも存在しますが、私はそれらを知らない)。この表現では、符号は第1のビットによって与えられる。つまり、2の補数表現では、正の数は0から始まり、負の数は1から始まります。

ここで問題が発生します。0は正数か負の数ですか?与えられた数字ビット(5:00000と10000)に対して0を2つの方法で表すことができます。すなわち、もう1つの数字を入れるスペースを失います。どのように決定したのか分かりませんが、実際は0が正数です。任意のビット数、符号付きまたは符号なしの場合、0は0のみで表されます。

グレートです。これは最初の質問に対する答えを与えます:2の補数で表される10進数の上限は何ですか?最初のビットは符号のためであることがわかります。したがって、表現できるすべての数字は4ビットで構成する必要があります。 16ビットの4ビット文字列を持つことができ、0はその1つで、上限は15です。

ここで、負の数の場合、これは簡単になります。私たちはすでに32ビットのうち16ビットを5ビットで満たしています。 16去った。また、0はすでに表現されているので、それを含める必要はありません。次に、0:-1の直前の数字から開始します。 -1から始まる16個の数字があるので、5ビットで表現できる最も小さい符号付き整数は-16です。

さらに一般的には、nビットでは、2^nを表すことができます。符号付き整数では、半分が正であり、半分が負である。すなわち、我々は2^(n-1)の正の数と2^(n-1)の負の数を持っています。我々が知っているように0は正と考えられている、我々はnビットで表すことができる最大の符号付き整数は2^(n-1) - 1あり、最低は今は5で表すことができる番号を知っている-2^(n-1)

2の補数表現

あります問題は、私たちがそれらをどのように表しているかを知ることです。

すでに、最初のビットに符号が表示されていて、0が正と見なされています。正の数の場合は、符号なし整数の場合と同じように動作します。00000は0、00001は1、00010は2などです。01111までは15です。これは正の符号付き整数に対して停止します。私たちが持っていた16の値。

負の符号付き整数の場合、これは異なります。同じ表現(10001が-1、10010が-2、...)を維持すると、11111は-15になり、10000は帰属しません。それが-16だと言うこともできますが、負の整数で作業するたびにこの特定のケースをチェックする必要があります。さらに、これはバイナリ操作のすべてを混乱させます。 10000が-1、10001が-2、10010が-3などであると判断することもできますが、バイナリ操作のすべてを駄目にすることもあります。

2の補数は次のように動作します。符号付き整数10011があり、10進数が何であるかを知りたいとしましょう。

  1. フリップすべてのビット:10011 - >
  2. 01100追加1:01100 - > 01101
  3. 符号なし整数として読む:01101 = 0 * 2^4 + 1 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 13。

10011は-13を表す。この表現は、両方の方法で動作するため、非常に便利です。 -7をバイナリ符号付き整数として表現する方法は?

> 11001そして、それはそれだ - 11000:> 11000

  • 1を追加 - 00111:すべてのビットが00111.

    1. フリップである7のバイナリ表現で開始! 5ビットでは、-7が11001で表されます。

      私はそれをカバーしませんが、2の補数の別の大きな利点は、追加が同じように機能することです。つまり、2つの2進数を追加するときは、符号付きか符号なしかを気にする必要はありませんが、これは同じアルゴリズムです。

      これで、質問に答えることができますが、もっと重要なことは答えを理解することができるはずです。

      このトピックは、2の補足を理解するのに最適です。Why is two's complement used to represent negative numbers?

  • +0

    非常に良い。示唆、 "すべてのビットをシフトする"は、左または右シフト操作と混同する可能性があります。おそらくフリップ、またはウィキペディアは反転を使用します。 – foo

    関連する問題