牛、豚、鶏、どれか一つ食べられなくなるとしたら?

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

A 回答 (6件)

 


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

 
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/12 22:18

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
    • good
    • 0

>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長だけでは絶対に表現しきれない数の体系だということになります。
    • good
    • 0

2番です。



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

 


>129でも-127でもある、
これは負の数を扱わないと決めた時です

>00000001は1でも-255でもある
この様に考えるなら00000001+00000001は幾つになりますか?

 
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/12 22:32

まず、8ビットで扱えるのは-128~127です。

-127じゃないですね。

で、8ビットで表せる数の種類は、256通りだけです。
ですから、-255まで表したいとなると、正の数が扱えなくなります。
-256~255まで扱いたいとなると、512通りの識別が必要で、9ビット必要になります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/03/12 22:30

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