• ベストアンサー

ビットシフト演算子について

-8を2進数で表すと111111111・・・000となるのはなぜですか?

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada46
  • ベストアンサー率39% (13/33)
回答No.3

簡単のために8ビットでやってみます。 8は2進数だと 00001000 ですよね。 8 + (-8) = 0 なので、 00001000 + (?) = 00000000 になる?の部分が-8に なるわけです。 で、2進数で表した8である 00001000のビットを反転させると 11110111ですね。これらを足すと 00001000 + 11110111 = 11111111 になります。この両辺に00000001を足すと 00001000 + (11110111 + 00000001) = (11111111 + 00000001) 00001000 + 11111000 = 100000000 となります。8ビットで表現しているので、 右辺の100000000の先頭1ビットは無視されて、 00000000すなわち0になります。要するに、 00001000(10進の8) + 11111000(10進の-8) = 00000000(10進の0) というわけで、11111000が-8という事になります。 これの求め方は2進数で表した8のビットを反転させて1を足せば良い事になります。 00001000(10進の8) 反転させて 11110111 1足して 11111000 これが-8となります。

DINO-PIE
質問者

お礼

ありがとうございました。 マイナスの場合は1を足すのが基本なのでしょうか?

その他の回答 (3)

  • yamada46
  • ベストアンサー率39% (13/33)
回答No.4

今度は16ビットで考えてみます。 8と8のビットを反転させたものを足すと  0000000000001000・・・8 +)1111111111110111・・・8のビットを反転させたもの ----------------------------------------------- 1111111111111111 これに1を足すと 10000000000000000 になります。16ビット有効なので、この結果の先頭の1は無視されます。そうすると 0000000000000000 すなわち0です。 "8"と"8を反転させて足したもの"に"1"を足したら0になったので、ある正数のマイナスを求める場合は、 「反転させて1を足す」 となります。

  • sha-girl
  • ベストアンサー率52% (430/816)
回答No.2

10進数の-1が2進数(32bit:int)だと (1111 1111 1111 1111 1111 1111 1111 1111)・・・-1 って事はわかっているでしょうか? もしわからないのであれば 「2の補数」で検索してると良いでしょう。 何故そうやって表すかですが 2の補数でデータを持っていると 足し算(引き算)を扱いやすいのです。 例えば-8 + 7だと 1111 1111 1111 1111 1111 1111 1111 1000・・・-8 0000 0000 0000 0000 0000 0000 0000 0111・・・-7 を足すと 1111 1111 1111 1111 1111 1111 1111 1111・・・-1 「2の補数」を使えば符号に関係なく そのまま、足す事ができるのです。

参考URL:
http://ja.wikipedia.org/wiki/2%E3%81%AE%E8%A3%9C%E6%95%B0
DINO-PIE
質問者

お礼

ありがとうございました。URL参考にさせていただきます。

回答No.1

それは -8 = ~8+1 だからです。

DINO-PIE
質問者

お礼

1足すのですね。

関連するQ&A