2進数の足し算と2の補数の両方について

このQ&Aのポイント
  • CPUは引き算を行うことができず、2の補数を用いて引き算を足し算として考えれると知りました。この方法では、8bitの最上位桁を符号として扱い、残りの7bitで引き算を表現します。
  • 質問の例では、-24と-8の引き算を計算しました。具体的な計算手順は、まずそれぞれの数を2進数に変換し、2の補数を求めます。そして、足し算の手順で計算し、結果を2の補数に戻すことで正しい答えを得ることができます。
  • 質問者は、値を足した結果が1100000となった場合、どの条件でその数値の2の補数をとる必要があるのか知りたいとしています。具体的な条件については、質問文には明示されていませんが、一般的には符号ビット(最上位桁)が1である場合に2の補数をとります。
回答を見る
  • ベストアンサー

2進数の足し算について

CPUは引き算を行うことができず、2の補数を用いて引き算を足し算として考えれると知りました。 そこで8bitの最上位桁を符号とした7bitの引き算-24+(-8)を計算してみたのですが 24(10進数)→0011000(2進数)→1101000(2の補数) 8(10進数)→0001000(2進数)→1111000(2の補数) 符号 7654321←bit  1 1101000 +1 1111000  X 1100000 となり、1100000の2の補数をとると 0100000(2進)→32(10進数)で答えを求められました。 そこでお聞きしたいのですが、値を足したとき(↑の例だと1100000)が求められたときにどういった条件だと1100000の2の補数をとる必要があるのでしょうか? ↑の例だとXがどの条件のときでしょうか? 質問が長くなってしまいましたがよろしくお願いします。

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

  • ベストアンサー
  • info22
  • ベストアンサー率55% (2225/4034)
回答No.3

> 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だと負数と分かるだけです。

Y2xXeME7
質問者

お礼

解答ありがとうございます ご指摘のとおり符号ビットもいれた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の補数は用いられないのでしょうか?

その他の回答 (5)

  • info22
  • ベストアンサー率55% (2225/4034)
回答No.6

#3です。 A#3の補足質問の回答 > そこで10進数に戻す際には2の補数を行い11100000→00100000になるということでしょうか? そうです。 11100000 → -(00100000) → -32 という手順で戻します。 >8bit以上の計算では2の補数は用いられないのでしょうか? 計算機で走っているソフト次第です。 大抵は倍精度の整数が扱えます。 普通のソフトの整数(単精度)では16ビットの2進数を扱っています。 (8ビットの2の補数による整数は8ビットマイコンの時代のマシン語やアセンブラなどで使われていました。) 倍精度整数では32ビットの2の補数法、4倍精度整数では64ビットの2の補数法が使われます。

Y2xXeME7
質問者

お礼

ご丁寧な回答ありがとうございました。 とても分かりやすかったです。

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.5

#4です。 下記の「演算」は「足し算」と訂正させて下さい。計算を見てもらえば意をくみとっていただけると思いますが、訂正させてね。 >負数同士の演算は負にならないとね。 >どういった条件だと1100000の2の補数をとる必要があるのでしょうか? 回答者のみなさんが教えて下さっているのでなんですが、2の補数は、正の2進数から負の2進数を求めるときの計算方法だと考えると判りやすいかも。つまり真逆は、負の2進数から正の2進数を求める行為をしている。演算だけに限るなら2度手間だからする必要はないと。 あえてするなら2進-10進に変換したいときの中間処理かな?

Y2xXeME7
質問者

お礼

回答ありがとうございます。 ご指摘のとおり符号部分も含めて計算すると解決できました。

  • A88No8
  • ベストアンサー率52% (834/1602)
回答No.4

こんにちは 符号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% (7987/21354)
回答No.2

何か誤解をされているようですが、「引き算」と「足し算」は、機械語 でも厳然と区別されてプログラムされてますよ。ですので、結果を見て 判断するんじゃなく、どこかに「これは引き算です」というフラグが あって、そのフラグがあれば補数の計算をするんです。 具体的には「引き算」サブルーチンを呼び出す、という処理なんですが。

Y2xXeME7
質問者

お礼

解答ありがとうございました

回答No.1

  >32(10進数)で答えを求められました。  -32ね。 >どういった条件だと1100000の2の補数をとる必要があるのでしょうか?  Xの最上位ビットが 1 のとき。  

Y2xXeME7
質問者

お礼

早速の解答ありがとうございました

関連するQ&A

  • 2進数の掛け算ができません

    初めまして。2進数の掛け算で困っています。よろしくお願いします。 10進数で2*(-3)=-6ですが、これを3bitの2進数で行ないたいと思います。 すると、010*101(2の補数)=01010となります。 -6は10(2の補数)となるはずですが答えが異なります。 符号拡張というものがあるということで、次はそれで行なってみます。 010*1101(符号を拡張した2の補数)=011010となります。 答えが異なります。ますますわけがわかりません。 ---------- 次に10進数で(-1)*(-1)=1ですが、これを2bitの2進数で行ないたいと思います。 すると、11(2の補数)*11(2の補数)=1001となります。 1は1となるはずですが答えが異なります。 符号拡張というものがあるということで、次はそれで行なってみます。 111(符号を拡張した2の補数)*111(符号を拡張した2の補数)=110001となります。 答えが異なります。ますますわけがわかりません。 ---------- 話は変わるのですが、 Nビット×Mビット=N×Mビットになる とのことです。これも理解できません。 どなたかご教授をお願いしますm(__)m

  • 補数を利用した引き算について

    こんにちは。 『2進数で 111 - 010 を計算をせよ。』 という問題があります。 つまり10進数でいう所の 7 - 2 = 5 の計算をします。 補数を利用すると引き算が足し算ででき、演算が簡単になることを 本は説明しようとしてるのですが、腑に落ちない点があります。 解説では --------------------------------- 引く数 010 の補数を求めると 101 なので  111 +101 -------- 1101  ↓  101 よって桁上がりを無視した 101 が答え --------------------------------- との事ですが疑問に思うことがいくつかあります。 I. 上記の計算では3ビットであることが前提になっています。 7 - 2 = 5 をしたいわけですから、そうすると  111 ←符号なしの表現 ( 7 ) +101 ←符号付きの表現 ( -2 ) -------- 1101  ↓  101 ←符号なしの表現 ( 5 ) となり、符号なしと符号付きの数値を混ざってしまうが、良いのでしょうか? また、この説明の仕方だと答えが 0~7 になる答えしか出せません。つまり引く数の方が大きいと計算できません。 私は補数を使うのであれば正の値・負の値、全て符号付きの値でなければいけないと思っていたので、 もし私が説明するのであれば全て符号付きにし、そして符号付きで7を表せるようにするために4ビットにして  0111 ←符号付き( 7 ) +1110 ←符号付き( -2 ) ---------- 10101  ↓  0101 ←符号付き( 5 ) とするのであれば納得できます。 答えの範囲も -8~7 と負の値も許容できます。 II. 実際には 本のように引く数だけを補数にして足し算をして答えを求めているのか、 それとも私のように正の値・負の値、ともに符号付きの表現にして足し算をしているのか、 もしくは、いずれとも違うのか、どうなのでしょうか? また、参考文献などがありましたらご紹介お願いします。 以上ですがよろしくお願いします。

  • ある二つの数の足し算を間違え、引き算にしたら、5.7になった

    ある二つの数の足し算を間違え、引き算にしたら、5.7になった 正しい答えとのその差13 ある数とは? これはどうといたらいいですか x+y=Z x-y=5.7 そのつぎはどうやったらよいでしょう?

  • 負の2進数の表示がわかりません

    Q1:負の数(例えば10進数の[-2])を2進数,4ビットで表すには, 1010(MSDの[1]は[-]を表して,後半の3桁は[2])か 1110([0001]の2の補数) どちらが正しいのですか?(学校ではどちらも習いました) またQ2のような計算をするには補数による表示でないとなりませんか?(絶対値に符号をつけるだけだと計算が合いません) Q2:4ビットで表された2進数の計算で    0101-0010=0101+(1110)=10011 となり,答えが5ビットになってしまいます.下4桁で考えると答えが合っている気がします.これで合っていますか?

  • 負の二進数

    2の補数表現を用いた符号付き8ビットの2進数のとき 10進数で -6 の値はどうなるのでしょう・・・? 16進数時の値と考え方も教えていただければ幸いです・・。 よろしくお願いいたします。

  • 0と1の足し算について

    0と1の2進数の値を、足し算するプログラムを作成したいのですが、どのよに、桁を上げれば良いか解らないので教えてください。宜しくお願いします。 内容は次の通りです。 1.キーボードから入力されるものとし、入力される値は2進数と符号プラス(+)のみとします。加算する桁数は4桁とします。 2.2進数の値を加算させ、加算方法を記述したコードを用いる。 3.printf以外の関数は使用しない。 4.出力する際は、int型、char型でも構わない。 5.コマンドプロンプトを用いて、入力し出力する際は、以下の通りに出力する。 (入力例) 1111 + 1111 [Enter] (加算する値と値の間にプラスの符号(+)を入力させ[Enter]キーを入力。 (出力例) 1111 + 1111 = 11110 ([Enter]キーを押されたら式と、その合計を出力させる。

  • 10進数(+-)→2進数への変換(2)

    先ほど、ご質問させて頂きました者です、詳細にご説明させて頂きます (1)10進数:-16072 → 2進数:1100 0001 0011 1000 補足:2進数の16bit目の「1」は符号ビット「ー」 (2)10進数:+16072 → 2進数:0011 1110 1100 1000 補足:2進数の16bit目の「0」は符号ビット「+」 補足:10進数の値の範囲は    2進数で 符号1bitを含む16bitの値の範囲です と変換できるVB関数をご教示ください 宜しくお願いいたします

  • 2進法と10進法の演算問題

    2進数→10進数(負の数)<2の補数表現> 8bit(8桁)の一番左のbitは符号bitとする 1)11111111 2)10011100 3)1.0010000 4)1.1100001 上記の問題が分かりません。 4桁ずつに分けて10進法に直して考えればよいのでしょうか? 補数表現自体よく分からないです。

  • 2進数の補数表示について

    よろしくお願いします 「負の数(-128)を8ビットの2の補数表示するとき、どうなるか?」 の問題で、わからない箇所があります。 1.最上位ビットは正・負を表す。 2.負の数:-127を2の補数を使用して表現する。    (例)-1(10)==>    まず、正で考える。      ==> 0000 0001(2)      「確認」 1111 1110(反転)            +1(プラス1) ---------- 1111 1111(2)(答え) -127(10)      ==>0111 1111(2)  まず、正で表す。    「確認」        1000 0000(反転)           +1 (プラス1) ---------- 1000 0001(答え) ここからが疑問なんです。    -128(10)の場合      ==>1000 0000(2) まず、正で考える。    「確認」        0111 1111(反転) +1 (プラス1)       -----------      1000 0000(2)(答え) ↑ ・答えがプラスの128(10)=>10000000(2)と同じではない  でしょうか? ・このときの最上位ビットは桁上がりの「1」と正負の違  いを表す「1」のどちらを表しているのですか? ・たとえば「負数を2の補数で表すとき,8ビットで  表現できる整数の範囲は10進数でどれか。」など  の問題で答えが正の127は理解できるのですが、  負は「-128」ということがよくわかりません。 一応検索をしてみましたが、類似回答では理解できませんでした。よろしくお願いします。        

  • 補数について質問

    例えば2進数であれば、ある数aの補数はその数aの負の値ですが、 その理由は、最上位の桁を無視するからですか? 例えば10進数の10の補数では、39の補数は61ですが、最上位の桁を無視するので、-39が補数とも言えますよね? yesかNoかでお答え頂けましたら幸いです。 具体的な式で説明します、この考え方も正しいか判定してくだされば幸いです。 (ex:51-39 補数の概念で計算:51+(61-100)=12 (61-100)は最上位の桁を無視する式に対応していて、その答えは-39。