プロが教える店舗&オフィスのセキュリティ対策術

次の計算を8桁の2進数で行い、結果を2進数と10進数で答えなさい。
(1)100+85
(2)(-100)+(-52)

この問題を
(1) 2進数➡10111001   10進数➡185
(2) 2進数➡101101000  10進数➡-152

と答えた所不正解だったのですが、間違いがわかりません。
解説をいただけると嬉しいです。

質問者からの補足コメント

A 回答 (3件)

No.1 です。

「補足」を見ました。

「6」の問題の前の「4」「5」が「負数の表現には2の補数を用いている」と書いてあるから、「6」の負数にも「2の補数を用いる」と考えるのがふつうだと思いますけどね。
ただ、計算結果からすると、#1 に書いたように「符号を含めて8桁」では足らないので、そこをどう書くかですね。

質問者の答(#1 と同じですね)で「間違い」とされるなら

符号は別出しにして

(1)  100[10] + 85[10] = 0110 0100[2] + 0101 0101[2]
= 1011 1001[2] = 185[10]

(2) (-100) + (-52) = (-0110 0100[2]) + (-0011 0100[2])
= -1001 1000[2] = -152[10]

でしょうね。

書き方の問題だけど、(2) で「桁あふれ」させて

(2) (-100) + (-52) = 1001 1100[2] + 1100 1100[2]
= 1 0110 1000[2]
→ (桁あふれを負号とみなして)
= -(1001 1000[2])   ←「8ビット」分を2の補数に
= -152[10]

と書かせたいのでしょうか。
上のように「負号 + 絶対値」で計算したのと同じだけど。

出題者に題意を明確にしてもらうことが先決でしょう。
    • good
    • 0

(2) の 2進数 101101000 が間違っています。


他の 3個は正解です。

10進数 -152 を 2進数で表すと、-10011000 です。
-152 が 10進 3桁であるのと同じように
-10011000 は 2進 8桁です。
符合は、桁数に含めて考えることはできません。
数学では、そうなっています。

パソコンの世界では、符合を別途つけるのを避けて
ビット列で負数を扱うために、整数ではなく
mod 2^m で計算することもあります。
(単に絶対値を表す 2進数に符合ビットを添えることもあるし、
1の補数とか、ちょっと変わった表現方法もありますけど。)

パソコン界の人は考え方がラフなので、mod 2^m のことを
「m桁の 2進数」とか言ってしまうことがありますが、
そのとき扱っているのは、あくまで mod 2^m の計算であって、
整数の計算を 2進法で書いたものとは違うのです。
別物なんです。
    • good
    • 0

「8桁の2進数」で「正数、負数」を表す方法を理解していますか?


「2の補数」を使う方法です。

「2の補数」とは、相互に足し合わせると「桁あふれ + 0」になる数のことです。

つまり「8ビットの数」たとえば「0111 0101」があるときに、これとは別の「1000 1011」という2進数を考えます。
そうすると
 0111 0101 + 1000 1011 = 1 0000 0000
になるので、右辺の「最上ビット(9ビット目)」が「桁あふれ」で消えるとすれば
 0111 0101 + 1000 1011 = 0000 0000
ということになって、「たし合わせると 0 になる数」なので
「0111 0101」の絶対値が同じ負の数は「1000 1011」
ということになります。
それが「2の補数」です。

このためには、「すべての数を8ビットで表わす」(9ビット目は無視する)という「固定ビット数」の表記であることが条件です。

この方式だと、「8ビット」なら
・正数:0000 0000 ~ 0111 1111(10進数で 0~127)
・負数:1111 1111 ~ 1000 0000(10進数で -1~-128)
ということになります。
ということは、問題で示された計算結果は、「符号付8ビット2進数」では表現しきれないことになります。

問題文に、本当に「8桁の2進数で」と書いてありますか? 「符号ビットと8桁の2進数で」とか、「9桁の2進数で」「12桁の2進数で」と書かれていませんか?

このように、再上位ビットが「0」なら正数を、「1」なら負数を表わすことになり、実質的に「最上位ビットが符号を表す」ことになります。ただし、負数の場合には残りビットをそのまま読んでも「絶対値」にはならないので要注意です。(あくまで「足して 0 になる」という数ですので)

「2の補数」の作り方は

・元の数:0111 0101
 ↓
・0 と 1 とを逆転させる
 → 1000 1010
 (これを「1の補数」と呼ぶことがある)
 ↓
・それに「1」を加える
 → 1000 1011

で出来上がり。

この「2の補数の作り方」は「正数→負数」を作るときだけではなく、「負数→整数」を作るときも全く同じです。
試しにやってみてください。

********************

以上の前提で問題を解けば、「進数」を数値の後に [ ] で示せば

(1) これは「正数」どうしなので、そのまま足し算を行ないます。
100[10] = 0110 0100[2]
85[10] = 0101 0101[2]
なので
 100[10] + 85[10] = 0110 0100[2] + 0101 0101[2]
= 1011 1001[2] = 185[10]

ただし、近計算結果は「符号付8ビット2進数」では表せないので、 「符号ビットと8桁の2進数」つまり「符号ビットを付加して9ビットにした符号付2進数」で計算することにします。

100[10] = 0 0110 0100[2]
85[10] = 0 0101 0101[2]
なので
 100[10] + 85[10] = 0 0110 0100[2] + 0 0101 0101[2]
= 0 1011 1001[2] = 185[10]

(2) 負数なので
まず
 100[10] = 0 0110 0100[2]
 52[10] = 0 0011 0100[2]
として、これを「2の補数」にして「負数表現」にします。

・元の数:0 0110 0100[2]
 ↓
・0 と 1 とを逆転させる
 → 1 1001 1011
 ↓
・これに「1」を加える
 → 1 1001 1100
これが「100[10] の負数表現」になります。

・元の数:0 0011 0100[2]
 ↓
・0 と 1 とを逆転させる
 → 1 1100 1011
 ↓
・これに「1」を加える
 → 1 1100 1100
これが「85[10] の負数表現」になります。

よって
 -185[10] + (-52[10]) = 1 1001 1100[2] + 1 1100 1100[2]
= 1 0110 1000[2]

この2進数の絶対値を知るために「正数」に変換するには、
・元の数:1 0110 1000[2]
 ↓
・0 と 1 とを逆転させる
 → 0 1001 0111
 ↓
・これに「1」を加える
 → 0 1001 1000[2] = 152[10]

従って、
 1 0110 1000[2] = -152[10]
ということになります。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
問題文を補足させて頂いたので、確認をしていただけると嬉しいです!

お礼日時:2021/07/14 00:10

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!