基本情報処理技術者
固定長の2進数の足し算を行うと、繰り上がって、桁が増えることがあります。
このような場合、固定長からあふれたビットは切り捨てます。
→なぜ切り捨てるかわからないです
参照元URL
https://ja.wikipedia.org/wiki/%E3%83%93%E3%83%83%E3%83%88%E6%BC%94%E7%AE%97
・2進数の足し算
7+7を下記のように2進数に変えて計算したとき
0111
+0111
────
1110→ 0011(+2)
なぜ1110が0011になるのでしょうか?
参照書籍
うかる!福嶋先生の集中ゼミ基本情報技術者 45P
お手数ですがご教授ください。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
以下の回答は多くの部分に推測を含みます。正しい条件等は当該書籍を確認してください。
まず、この問題は4ビットの符号付整数での計算と考えられます。
符号付整数では最上位ビットが1である場合、負数の2の補数表現ととらえます。
これを踏まえて、まず2進数で7+7を計算します。これは
0111 <=7 + 0111 <=7 ──── 1110
となりました。符号なしなら10進数の計算通り「14」と解釈されるところですが、これは符号付整数で、最上位が1になっているため、負数の2の補数表現で解釈しなければなりません。
1110の2の補数、つまりこれと和をとって桁上がりし5ビットになる最小値は
10000 <=5ビット最小値 - 1110 ──── 0010 =>2
2です。したがって、1110は-2と解釈されます(ここが本のミスか書き写し間違い?)。
正の整数同士の和をとって負数になるのは普通の世界ではありえないのですが、コンピュータの世界ではこのようなことが起こります。これは、「7+7」がこの符号付4ビット整数で表現できる最大値「7」を超えてしまうため起こる現象です。これをオーバーフローと呼びます。
###2の補数
そもそも2の補数とかコンピュータの表す数の意味が分かっていないようなのでこの辺にも触れておきます。
まず基本的にコンピュータは加算は得意ですが減算は苦手です。
苦手な減算を得意な加算に置き換え、全体の整合性が取れるように、2の補数表現があるのです。
2だとなじみにくいでしょうから、いつも使っている10進数で考えましょう。
7325-1589を計算しようとすると、繰り下がりが多く一般の人が暗算しようとしても結構面倒です。
では、この引く数1589を、10000-xという形で表せたらどうなるでしょう?
7325-1589 = 7325-(10000-x) = 7325-10000+x = (7325+x)-10000
となります。減算の繰り下がりに比べたら加算の繰り上がりのほうが簡単で、
10000引くという計算は簡単なので、そのまま減算するより楽になります。
こういうxを、今は10進数で考えているので、10の補数表現といいます。
4桁で考えた場合、最後の10000引く操作は桁あふれした分を除外することに相当します。
このxを求めると、1589=10000-xですから、x=10000-1589となります。
やっぱり繰り下がりのある引き算になるじゃないか…となりそうですが、この計算を
x = 10000 -1589 = (9999+1)-1589 = (9999-1589)+1 = 8410 +1 =8411
とします。3行目のカッコ内は10進数で使う最大の数字9が並んだ数からの引き算なので、繰り下がりなく引き算ができます。このカッコの計算で出てきた8410は、1589の9の補数というものです。10の補数より1小さいので9の補数というわけです。
これと同じことを2進数でもやるわけです。
投稿2017/03/14 01:14
編集2017/03/14 15:25総合スコア20675
0
切り捨てない場合、溢れたビットの居場所がないからです。
例えば 12 までしか数が無い場合、13 時は 1時になります。13 時なのか 1 時なのかは状況によって判断します。
この質問の場合も、桁溢れしたら桁溢れレジスタにフラグが立ちます。溢れたことが重要だとしたら、どこか別に自分で保存して使いますし、要らなければ捨て置きます。
投稿2017/03/13 07:53
総合スコア28673
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/14 06:18
2017/03/14 06:58
2017/03/14 07:00
2017/03/14 07:01
2017/03/14 07:09
2017/03/14 07:38 編集
2017/03/14 07:48

0
もとの書籍に何がかいてあるのかよくわからないので、わかることだけ回答します (結局、他の方と同じことを説明しているのですが)。
1
まずは、わかりやすい10進法でやってみます。
最初に、例として次の筆算をやってみましょう。
10000 -) 3602 ---------
このようになります。
₉₉₉ 10000 -) 3602 --------- 6398
1の位では、0から2は引けないので上の桁から10を借りてきて、10 - 2 = 8です。10の位では、1借りたのでさらに上の桁から借りてきて9にして、9 - 0 = 9です。100の位、1000の位も同じです。
ここで興味深いのは、10の位から上では9から引けばよいが、1の位だけはひとつ多い10から引く、ということです。ですから、次のように計算しても結果は同じです。
投稿2017/03/14 05:37
編集2017/03/14 06:51総合スコア4443
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

0
説明を写し間違えてはいませんか?
「2の補数について」という事なので、以下のような計算についての解説だったのではないでしょうか?
4ビット長の2進数で、負の数を2の補数で表現する時、7-4を計算する。
負の数を2の補数で表すので、7-4の計算は、7 + (-4)を求めれば良い。
手順1: -4 を2の補数で表す。
2の補数は、1の補数に1を加えたものだから、以下の計算で 1100 と求まる。
1111 - 0100 <= 4 + 1 ------ 1100
手順2: 7 + (-4) を計算する。
7を2進数で表すと 0111、 -4は1100だから
0111 + 1100 <= -4 ------ 10011
ここで、5桁目に繰り上がった1を切り捨てると、 0011 (10進数で3)が得られて、
7-4=3の計算が出来た。
投稿2017/03/13 08:33
総合スコア6919
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。