アプリ版:「スタンプのみでお礼する」機能のリリースについて

先程+20の2の補数表現を質問させてもらったのですが-20の2の補数表現についても質問したいです。-20の場合は符号+絶対値の1001 0100をビット反転し1を足した0110 1100でしょうか

A 回答 (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)
ということになります。

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

「2の補数」の作り方は

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

で出来上がり。

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


これを
 20[10] = 0001 0100[2]
にあてはめれば、「-20[10]」の「2進数の2の補数」は

・元の数:20[10] = 0001 0100[2]
 ↓
・0 と 1 とを逆転させる
 → 1110 1011
 ↓
・それに「1」を加える
 → 1110 1100

です。

そして
 -20[10] = 1110 1100[2]
の「2進数の2の補数」は

・元の数:-20[10] = 1110 1100[2]
 ↓
・0 と 1 とを逆転させる
 → 0001 0011
 ↓
・それに「1」を加える
 → 0001 0100

で、
 0001 0100[2] = 20[10]
となって、もとの「正の数」に戻ります。


>-20の場合は符号+絶対値の1001 0100を

そもそもその「-20[10]」の2進数表記が間違っています。

1001 0100[2] は

・元の数:1001 0100[2]
 ↓
・0 と 1 とを逆転させる
 → 0110 1011
 ↓
・それに「1」を加える
 → 0110 1100

ですから、
 0110 1100[2] = 64 + 32 + 8 + 4 = 108[10]
ということです。
従って、あなたの書いた2進数は
 1001 0100[2] = -108[10]
ということなのです。

「2の補数」を使った2進数では、それを見ただけでは「負の絶対数」は分かりません。あくまで「正の数」と足し合わせると(桁あふれを無視すると)「0」になる、というだけの表記ですから。
そこを誤解しないように。
    • good
    • 0

No.1 です。

ちょっと長くて分かりづらいかもしれません。

要するに
「10 進数の -20」の2進数表記は
 -20[10] = 1110 1100[2]
であって、
 1001 0100[2]
ではない、ということです。

 1001 0100[2] = -108[10]
になってしまいます。

「2の補数表現」によるマイナスの表記は、「正の数」から「2の補数」で作るものであって、「(絶対値の)10進数から2進数への変換」に「負号」を付けた表記ではないからです。
そこの「基本」をしっかり理解できるように、#1 にちょっと長い説明を付けました。
    • good
    • 0

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