• ベストアンサー

255の2の補数、B'00000001'が-255を表さない理由は

こんにちは。 8ビットマイコンで、 127=B'01111111'の2の補数 B'10000001'は-127を 表します。 しかし、8ビットマイコンで、 マイナスを扱うのは、-127~127で 先頭一桁は正負を表すので 使えない、と説明されています。 しかし、 255=B'11111111'の2の補数を、 B'00000001'を-255としても、 問題ないのでは、ないでしょうか。 両者を足せば、0になります。 先頭ビットを使ってはいけない理由は、 何でしょうか。 (127までなら、マイナスは先頭 ビットが、0になる。分類に便利、 というなら、分かりますが)。 何か分かる人がいましたら、 よろしくお願いします。

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

  • ベストアンサー
回答No.1

  00000001を-255とするなら「1」はどの様に表現する?  

rheda
質問者

お礼

回答ありがとうございます。 00000001は1でも-255でも あるのではないでしょうか。 というのは、10000001は、 129でも-127でもある、 と本に書いてありました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.6

No.5の回答者です。 失礼しました,No.5の前半の文章は無視していただけますか。   255=B'11111111'の【全ビット反転して+1だから】   B'00000001'を-255としても、問題ないのでは? と質問者はおっしゃりたかったのだと,いま読み直してみて気づきました。 その考え方は正しいです。 ただ問題となるのは,-255~255という全整数の個数が「2の8乗」個で収まらないという,No.5の後半で述べたことだけです。 ですから1bit増やして9bit長にするだけで,その2の補数計算はそのまま通用します。  011111111 = +255 + 100000001 = -255 ---------- 1)000000000 = 0

全文を見る
すると、全ての回答が全文表示されます。
  • jjon-com
  • ベストアンサー率61% (1599/2592)
回答No.5

>255=B'11111111'の2の補数を、 >B'00000001'を-255としても、 >問題ないのでは、ないでしょうか。 >両者を足せば、0になります。 そもそもの勘違いはこれでしょう。 +255と-255を足して0になったのではなく,+255と+1を足して0になったのです。  11111111 =255 + 00000001 =1 ---------- 1)00000000 =256 255+1=256ですが,その計算結果は8bit長に収まらずあふれます。その結果,8bit長の中に0が8つ残ったのであって,8つのゼロだけ見ていては正しい計算結果は分かりません。 >00000001は1でも-255でもあるのではないでしょうか。 1でも-255でもある数だなんて矛盾しています。 8bit長を用いて,0~+255の数を表現してもいいし,-128~+127の数を表現してもいい。質問者がそうしたいなら, >貴方が-255~0を表すんだ、と解釈する分には全くそれでも問題ない(回答No.4) しかしいずれにしろ,8bit長であるのなら,識別できる数の種類は「2の8乗」個だという制限から逃れることはできません。 10000001 というビット列が,解釈Aの下では+129を表すかもしれないし,解釈Bの下では-127を表すかもしれない。しかしいずれにしろ,解釈が一つ決まったならその下では数の意味も絶対に一意に決まるはずです。でなければそもそも計算など成り立ちません。ある解釈の下で+129でも-127でもある数だなんて矛盾しています。 質問者が想像していらっしゃる 255=B'11111111' で -255=B'00000001' という数値表現の体系では,その他の +254~+1, 0, -1~-254 といった整数も表現できるのでしょうか? そうであるなら回答No.2で指摘されたとおり,そこで用いられる数の種類は「2の8乗」個を越えていますから,必然的に,それは8bit長だけでは絶対に表現しきれない数の体系だということになります。

全文を見る
すると、全ての回答が全文表示されます。
  • annyG
  • ベストアンサー率25% (10/39)
回答No.4

2番です。 ようするに誰が解釈するか、ということではないかと思います。 貴方だけがそれを-255だ、このバイトは-255~0を表すんだ、と解釈する分には全くそれでも問題ないと思います。 ただ、そのバイトを外部機器に渡せば、1だと解釈されてしまいます。 だから「いけません」と本には書いてあるのだと思います。

全文を見る
すると、全ての回答が全文表示されます。
回答No.3

  >129でも-127でもある、 これは負の数を扱わないと決めた時です >00000001は1でも-255でもある この様に考えるなら00000001+00000001は幾つになりますか?  

rheda
質問者

お礼

回答ありがとうございます。 たとえば、C言語のように、もともと、 正負の変数の型があれば、 符号付は、先頭ビットを正負に用いるので、 -128~127になる。といのは、 理解できます。 しかし、マイコン(PICのアセンブラ)では、 変数の型がありません。 そこで、単純に足して、0になる数を 負の数と便宜上扱っている、 と理解しました。とすれば、 00000001を-255と考えても いいと思うのですが。

全文を見る
すると、全ての回答が全文表示されます。
  • annyG
  • ベストアンサー率25% (10/39)
回答No.2

まず、8ビットで扱えるのは-128~127です。-127じゃないですね。 で、8ビットで表せる数の種類は、256通りだけです。 ですから、-255まで表したいとなると、正の数が扱えなくなります。 -256~255まで扱いたいとなると、512通りの識別が必要で、9ビット必要になります。

rheda
質問者

お礼

回答ありがとうございます。 たとえば、C言語のように、もともと、 正負の変数の型があれば、 符号付は、先頭ビットを正負に用いるので、 -128~127になる。といのは、 理解できます。 しかし、マイコン(PICのアセンブラ)では、 変数の型がありません。 そこで、単純に足して、0になる数を 負の数と便宜上扱っている、 と理解しました。とすれば、 00000001を-255と考えても いいと思うのですが。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • 2の補数

    (1)10進数1、2、3の値を2進数3桁で記述しなさい。またこれらの2の補数を求め3桁で記述しなさい。 (2)2進数における「2の補数」は、コンピュータにおける数値の扱いにおいて重要な役割を担うことができる。その役割について説明しなさい。 (3) (1)の解答から(2)で解答した役割は適切に機能していることが分かる。その理由を説明しなさい。 (4)2進数で表記したある数値の「2の補数」の求め方としてして、「各桁の1と0を反転し、それに1を加える」という方法がある。この方法が成立する理由を説明しなさい。(ヒント:2^b-1がどういう数であるかを考えるとよい) この問題の(2)からどう説明していいか分かりません。 どなたか教えて下さい。

  • 2の補数の計算について

    C言語のプログラム中で得られた10進数の値を,固定長16ビットの2進数に変換したいと考えています. しかしながら,得られた10進数の値が負数であった場合,それを負数と判断し,2の補数として出力したいのですが,なかなかいい方法が思いつきません… 例えば処理中で -1.915098 といったような10進数の値を2進数に変換し,先頭の1ビットが正負符号の2の補数として表現するためにはどのように記述すればよいでしょうか? 簡単で構いませんので,記述例も書いていただけると助かります…

  • 補数について質問

    以下はJavaの参考書に掲載されている補数についての問題です。 疑問点にお答えいただけましたら幸いです。 次の10進数の補数を8桁の2進数で求めなさい A 15 B 0 C 1 質問1:Bについて、10進数の補数が0となっていますが、こんなのありえるんですか? 補数の定義は、「ある数 A に加えると、和の桁がひとつ上がる最小の数」ということなので、Bならある数がAが100でそれに加える数が0ということでしょうか? 質問2:質問1で記した定義に従い、補数15のある数Aとは85ですか? 質問3:「次の10進数の補数を8桁の2進数で求めなさい」という問題、そもそもどういう意図があるんですか?何故10進数の補数を8桁の2進数で求めさせるんですか? 質問4:この問題、10進数の補数を8桁の2進数に変換する問題かと思いきや、この10進数の補数を2進数に変換し、さらにその変換した2進数を補数にしたものが答えとなっています。 何故ですか?問題文おかしいような、、、 僕が読解を間違えたのでしょうか?

    • ベストアンサー
    • Java
  • 補数について質問

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

  • 補数について質問

    何度もすみません。 例えば2進数であれば、ある数aの補数はその数aの負の値ですが、 その理由は、桁あふれ無視するからですか? 例えば10進数の10^2の補数表示では、39の補数は61ですが、桁あふれを無視するので、補数表現としては61と-39は同じと考えられるからですか? yesかNoかで考え方が合っているか判定してください。 具体的な式で説明します、この考え方も正しいか判定してくだされば幸いです。 (ex:51-39 補数の概念で計算:51+(61-100)=12 (61-100)は最上位の桁を無視する式に対応していて、その答えは-39。

  • 補数について質問

    何度も何度もすみません。 例えば2進数であれば、ある数aの補数はその数aの負の値ですが、 その理由は、桁あふれ無視するからですか? 例えば10進数の10^2の補数表示では、39の補数は61ですが、桁あふれを無視するので、補数表現としては61と-39は同じと考えられるからですか? 絶対yesかNoかで考え方が合っているか判定してください。 絶対yesかNoかでお願いします。 具体的な式で説明します、この考え方も正しいか判定してくだされば幸いです。 (ex:51-39 補数の概念で計算:51+(61-100)=12 (61-100)は最上位の桁を無視する式に対応していて、その答えは-39。

  • 負の整数を求める

    負の整数を表現する問題で質問です。 4ビットのパターン1101を下記の通りに求め、小さい順に並び変える場合、 1, 1の補数による表現 2, 2の補数による表現 3, 絶対値に符号を付けた表現(先頭ビットが0は整数、1は負数) 1の補数は反転なので、0010とわかりますが、回答にこれは10進数の2だからと書いてありました。そこまではわかります。ただ、そのあとに、10進数の2だから、1101はマイナス2、とありました。なぜここでマイナス2となるのでしょうか? 2の補数の場合は反転した1の補数に1を加算して、0011とわかりました。しかし、またそれはマイナス3となっています。 3の絶対値に限っては先頭ビットは1なので負で、残りの3ビットは101で、10進数の5だから、マイナス5とあります。これに限ってはよくわかりません。 どなたか説明をお願いします。

  • 補数について質問--僕はプログミングしてます

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

  • 2の補数表現2進数が表す10進数は?、

    次の2の補数表現の2進数が表す10進数はいくらか? 1111 1111 1111 1111 1111 1111 1111 1111 という問題があるのですが、 これを解くと、まず、上のビット列は2の補数表現なのだから、これはマイナスですよね?そして、次にビット列を2の補数を求めるやり方でやると元の数がわかりますよね(この辺がいまいち解っていない)? という事は全ビットを0にして、最下位ビットに1を 足せばいいから0000 0000 0000 0000 0000 0000 0000 0000 + 1 =0000 0000 0000 0000 0000 0000 0000 0001 となります。10進数だと 1を表すから答えはー1という事になるのでしょうか?お願いします。

  • 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」ということがよくわかりません。 一応検索をしてみましたが、類似回答では理解できませんでした。よろしくお願いします。