- ベストアンサー
2進数の足し算と2の補数の両方について
- CPUは引き算を行うことができず、2の補数を用いて引き算を足し算として考えれると知りました。この方法では、8bitの最上位桁を符号として扱い、残りの7bitで引き算を表現します。
- 質問の例では、-24と-8の引き算を計算しました。具体的な計算手順は、まずそれぞれの数を2進数に変換し、2の補数を求めます。そして、足し算の手順で計算し、結果を2の補数に戻すことで正しい答えを得ることができます。
- 質問者は、値を足した結果が1100000となった場合、どの条件でその数値の2の補数をとる必要があるのか知りたいとしています。具体的な条件については、質問文には明示されていませんが、一般的には符号ビット(最上位桁)が1である場合に2の補数をとります。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
> 24(10進数)→0011000(2進数)→1101000(2の補数) →11101000(2の補数) …が正しい。 > 8(10進数)→0001000(2進数)→1111000(2の補数) →11111000(2の補数) …が正しい 符号ビットをつけて「2の補数」になります。 計算は8ビットで加算をします。 (-24)+(-8)= -(00011000)2-(00001000) =(11101000)2 +(11111000)2 =(11100000)^2 …最上位の8ビット目から9ビット目への桁上がりは無視します、 =-(00100000)^2 …これば10進数の「-32」です。 >どういった条件だと1100000の2の補数をとる必要があるのでしょうか? 2の補数法表現を正しく認識されていないようです。8ビットで2の補数で計算をしへっかも2の補数法で出てきますので改めて2の補数をとる必要はありません。負の数か、正またはゼロの数かは先頭ビットで判別できます。 それが2の補数法の特徴です。 >↑の例だとXがどの条件のときでしょうか? この質問はナンセンスです。 Xは8ビットの2の補数表現として求まります。そして先頭ビットで負数か、そうでないかを判別できます。 人間に分かりやすいようにする便法として、 10進数や普通の2進数に変換しますが、その際は 2の補数法表現を 符号と絶対値(符号なし数値)とに分離してやります。 先頭ビットがゼロならそのまま符号なし2進数(10進数の場合は10進変換してやる)になり、先頭ビットが1なら、符号「-」と絶対値(2の補数を取ってやれば絶対値が得られる)に分離して「-(符号なし2進数)」の形にしたり、10進数の場合は、符号なし2進数の箇所を10進変換してやります。 ■■ 2の補数法は8ビットを使った2進数の表現法です。■■ 演算も符号ビットを区別することなく、8ビットで行います。 結果として先頭ビットがゼロであれば正またはゼロの数、先頭ビットが1だと負数と分かるだけです。
その他の回答 (5)
- info22
- ベストアンサー率55% (2225/4034)
#3です。 A#3の補足質問の回答 > そこで10進数に戻す際には2の補数を行い11100000→00100000になるということでしょうか? そうです。 11100000 → -(00100000) → -32 という手順で戻します。 >8bit以上の計算では2の補数は用いられないのでしょうか? 計算機で走っているソフト次第です。 大抵は倍精度の整数が扱えます。 普通のソフトの整数(単精度)では16ビットの2進数を扱っています。 (8ビットの2の補数による整数は8ビットマイコンの時代のマシン語やアセンブラなどで使われていました。) 倍精度整数では32ビットの2の補数法、4倍精度整数では64ビットの2の補数法が使われます。
お礼
ご丁寧な回答ありがとうございました。 とても分かりやすかったです。
- A88No8
- ベストアンサー率52% (836/1606)
#4です。 下記の「演算」は「足し算」と訂正させて下さい。計算を見てもらえば意をくみとっていただけると思いますが、訂正させてね。 >負数同士の演算は負にならないとね。 >どういった条件だと1100000の2の補数をとる必要があるのでしょうか? 回答者のみなさんが教えて下さっているのでなんですが、2の補数は、正の2進数から負の2進数を求めるときの計算方法だと考えると判りやすいかも。つまり真逆は、負の2進数から正の2進数を求める行為をしている。演算だけに限るなら2度手間だからする必要はないと。 あえてするなら2進-10進に変換したいときの中間処理かな?
お礼
回答ありがとうございます。 ご指摘のとおり符号部分も含めて計算すると解決できました。
- A88No8
- ベストアンサー率52% (836/1606)
こんにちは 符号bitも含めて演算するだけでよいのでは? 1110 1000 1111 1000 + ----------- 1110 0000 いうまでもないことですが 8 bitで正の最大値は +127 (0111 1111b)、負の最大値は -128(1000 0000b)なので、結果が上記の範囲内なら負数同士の演算は負にならないとね。 -128+(-1)だと?8 bitで表現できる範囲を超えるのでアンダーフローが発生し計算が成り立たなくなります。 実際の 8 bit の演算器を持つコンピューターなら、演算の状態を様々なフラグ(符号?、演算結果がゼロ?、下位4bitからの繰り上がり有無、結果が8bitの範囲内か、桁上がりがあるか..)で知ることが出来ますのでそれを見て異常処理を入れます。
- FEX2053
- ベストアンサー率37% (7991/21371)
何か誤解をされているようですが、「引き算」と「足し算」は、機械語 でも厳然と区別されてプログラムされてますよ。ですので、結果を見て 判断するんじゃなく、どこかに「これは引き算です」というフラグが あって、そのフラグがあれば補数の計算をするんです。 具体的には「引き算」サブルーチンを呼び出す、という処理なんですが。
お礼
解答ありがとうございました
- yaemon_2006
- ベストアンサー率22% (50/220)
>32(10進数)で答えを求められました。 -32ね。 >どういった条件だと1100000の2の補数をとる必要があるのでしょうか? Xの最上位ビットが 1 のとき。
お礼
早速の解答ありがとうございました
お礼
解答ありがとうございます ご指摘のとおり符号ビットもいれた8bitの演算でした >8ビットで2の補数で計算をしへっかも2の補数法で出てきますので改めて2の補数をとる必要はありません。 >負の数か、正またはゼロの数かは先頭ビットで判別できます。 >それが2の補数法の特徴です。 とあるのですが、つまり 11101000 :24の2の補数 +11111000 :8の2の補数 11100000 :結果 11100000の最上位bitは1ということで負を表している。 そこで10進数に戻す際には2の補数を行い11100000→00100000になるということでしょうか? また、 >2の補数法は8ビットを使った2進数の表現法です。 とあるのですが8bit以上の計算では2の補数は用いられないのでしょうか?