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

2の補数形式において、アンダーフローなしに10010110から引くことのできる最大の値を10進表記で答えなさい
どうすればいいでしょうか? 2の補数形で11101001 正しいですか?

A 回答 (3件)

補数というのは、負の整数を2進数で表記する方法の1つです。

従って、正の整数が単独で存在しているだけでは補数という概念はありません。

最近のコンピューターでは負の整数は2の補数で表記するのが一般的です。

最上位ビットが符号を表し、0=+, 1=- となります。負の整数は、その絶対値となる正の整数を表す2進数の全ビットを反転させ、さらに1を加えたものになります。

これに対して、ブーリアン値には1の補数を用います。単純に全ビットを反転させるだけです。

整数に2の補数を採用するのは、引き算をする時に2の補数を足し算すればいいので演算機の設計が簡単になるからです。演算の結果、キャリが立った時に同時に符号ビットが反転したらオーバーフローまたはアンダーフローであることが判ります。

貴方のコメントの最後の式で

10000000(128) +

と書かれていますが、この表記ならば、

10000000(-128) -

とするべきです。数学的にはどちらでも同じですが、情報学的には誤りです。なぜなら、1byte で正の 128 は表現できないからです。

-106-x=-128
x=-106-(-128)
x=22 //

という方程式をを 2進表記したものが答えです。
    • good
    • 0
この回答へのお礼

10010110(-106)
10000000(-128) ー
------------------------
00010110 (22)
-128 の2の補数は10000000
10010110 は106の2の補数(?)
だから答えは00010110も2の補数?
00010110の最上位のビットは0=+であるため10進数に直すと反転足す1しなくても良いでしょうか?だから答えは22
もし最上位ビットは負であれば(例:10010110) 10進数に直すと反転+1しなくてはならないでしょうか?
ありがとうございます!

お礼日時:2017/05/21 16:45

補足しておきますと、


実際に計算するときは、引く数を2の補数表記 (全bit を反転して 1 を加える) にして足しますと、
10010110
+) 11101010
----------------
(1)10000000
となってキャリが立ちますが、符号ビットは反転しないのでアンダーフローは発生しません。
これより 1つ大きな値 (23=00010111two) だと 2の補数で 11101001two となり、
10010110
+) 11101001
----------------
(1)01111111
となって符号ビットが反転し、アンダーフローが発生することが判ります。

※ 上記において、(1) は8bit アーキュミュレーターの繰上がりを意味するキャリが立ったことを表しています。
    • good
    • 0
この回答へのお礼

答えてくれてありがとうございます
10進数では
10010110(-106)
x ー
ーーーーーーーー
1000000(-128)、
x は00010110(22)

2進数の計算で=
10010110(-106)
10000000(128) +
-----------------------
00010110(22) (2の補数表現で)
こういう考えは良いでしょうか

お礼日時:2017/05/21 14:21

1byte の符号付き整数で表現できる値の範囲は、


10000000two=-128
から
01111111two=127
までです。
それを踏まえて、10010110two から引くことができる最大の値は、符号ビットを除いた 00010110two=22 となります。(貴方の答えは補数表記で真逆です。)
    • good
    • 0

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