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

2進数8bitの計算で01111111(2)+00000001(2)の答えが符号なしで考えると128(10)となり符号付きで考えると-128になりオーバフローとなってしまうのが理解できません。当方は学制で学んだばかりなので分かりやすく教えていただけるとありがたいです

A 回答 (6件)

2進数そのものは、オーバフローしません。


2進数を、固定幅のレジスタに格納するとき、オーバーフローが起こるのです。
入れようとする中身の幅が
容器の幅より大きければ、ハミ出す...というだけです。

01111111(2)+00000001(2) の答えは 10000000(2) であり、
8桁の 2進数です。
符号なし 8bit なら、8bit あるから収まるし、
符号付き 8bit なら、1bit は符号ビットで仮数部は 7bitしかないので
収まりません。
    • good
    • 0

単純に考えて、3ビットだとします。



0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111

と、表せますね。一方で、先頭のビットで正負を表すときは、0の場合は正、1の場合は負と扱います。

 0 000
 1 001
 2 010
 3 011
 -4 100
 -3 101
 -2 110
 -1 111

と割り当てます。なぜかと言えば、それが便利だからです。

例えば、

2-2 = 0 

ですが、足し算では

2 + (-2) =0

となります。これを2進数でやってみると、先程のマイナスの表現を利用すると、

010 + 110 = 1000

で。オーバーフローした先頭を無視すれば0になり、10進数の結果と一致します。つまり、マイナスをそうやって表現すると、2進数の足し算だけで引き算を表現できるのです。

これを一般化すると、符号付きの2進数の全桁をひっくり返して1を足すと、もとの数字のマイナスの2進数になります。

例えば、8ビット符号付きとすれば、

01111101(2進数) >>> 125 (10進数)ですね。

2進数の全桁を、1>0、0>1にひっくり返します。

10000010

そして、1を足します。

10000011  >>> -125

となります。

01111101 +10000011  =(1)00000000

確かにマイナスになっていますね。
    • good
    • 1

2進数の1ビットめが、1 は 10進数では、1。


2ビットめが、1 は 10進数では2、
3 -> 4、
4 -> 8、
5 -> 16、
6 -> 32、
7 -> 64、
1ビットから7ビットめが全部 1 なら、10進数では、127 で最大。1 すらも加算できない。128にはなれない。
だから、無理やりやったらオーバーフロー。
だって、もう1ビットは符号のプラス・マイナスの表示に使うから、数値には7ビットしか使えないもん。
ちなみに1ビットめだけが奇数の1。
あとは、2、4、8、16、32、64 で、全部偶数。
だから全部のビットが1なら、1ビットめも1なので、合計は奇数。127。
    • good
    • 1

MSBが符号ビットになっていて、


0 は正の数、1 は負の数 と定義しているからです。
そして、10000000が-128になる理由ですが、
10進数で -128+1=-127になります。
2進数では 10000000+00000001=10000001
10000000を-128と定義すると、計算がスムーズに出来るのです。
別の考え方では、正の数は1を数える、負の数は0を数える。
    • good
    • 0

>のが理解できません


理解も何も。そういうルールなだけです。
7bit+符号1bitだと表現できる範囲は -128~+127。
符号なし8bitだと 0~255。
「オーバーフロー」とは、表現可能範囲を超え、正しくなくなってしまった
状態を指します。
>-128になり
正しくなくなっちゃったでしょ。

符号なし8bit だって 11111111+00000001→00000000
だけど9bit目の桁上りを表現できておらず、オーバーフロー状態です。
    • good
    • 0

若干、理解にズレがあるようにも感じるが・・・



まず
01111111(2)+00000001(2) = 11111111(2) = 255(10)

「符号付き」が「Sign Bit」の使用という理解で正しいのであれば
1.「Sign Bit」は先頭ビットを「プラス/マイナス」の表示に使用するので、数字を表すために使える桁数が1減る。
2.これによると「11111111(2)」の先頭の「1」は「マイナス」を表示することになり、残りの7桁で表せる最大の数は「128(10)」となる。
3.つまり「11111111(2)」は「-128(10)」となる。
    • good
    • 0

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