プロが教えるわが家の防犯対策術!

10000000
-128と128

2進数を提示された時にこの違いはどうやって区別するのですか?

質問者からの補足コメント

  • 以下のコードの結果はどちらも10000000になります
    int main() {
    bitset<8> bs1(-128);
    bitset<8> bs2(128);
    cout << bs1 << endl;
    cout << bs2 << endl;
    }

      補足日時:2021/10/06 10:58

A 回答 (6件)

与えられた「1000 0000」を


① ただの2進数    
とみなすか
② 8 ビットの符号付2進数
とするかの「宣言」「定義」によります。

10進数の場合でも、たとえば「12341234」という数値が与えられたとき、通常の感覚では「10進数だ」と解釈しますが、ひょっとすると「8進数」とか「6進数」であるかもしれません。
ただし「10進数以外のときは、そのように宣言する」のがふつうです。
「特に宣言しなければ『10進数』とみなす」
「10 進数以外のときには『○進数の 12341234』と宣言する」
ということかと思います。

2進数の場合でも、
「特にことわりがなければ『ただの2進数』とみなす」
「ビット数を指定して符号付2進数だと宣言すればそのようにみなす」
ということかと思います。

「8 ビットの符号付2進数」である場合には、たとえば「2」であっても
 0000 0010
と「上位ビットに 0 を付けて、必ず8ビットで表記する」ことになります。
先頭の数値(最も左の数値)が「0」なら「正の数」、「1」なら「負の数」になりますから。

「ただの2進数」なら、「2」は
 10
と書けばよいです。「上位の 0 は省略してよい」という一般原則があるからです。
「ビット数を指定した符号付2進数」の場合には、「上位の 0 は省略できない」ことになります。
    • good
    • 0
この回答へのお礼

なるほど私の知りたいことをまさに詳しく説明いただきありがとうございました

お礼日時:2021/10/06 11:49

No.3 です。



「通常の2進数」の「1000 0000」なら
 10進数の 128
です。

これが「8ビットの符号付2進数」であれば、「絶対値」を出すには
・0/1 を逆転させる → 0111 1111
・1 を加える → 1000 0000
で、これは「10進数の 128」ですから

 「8ビットの符号付2進数」の 1000 0000[2] = -128[10]

になります。

「8ビットの符号付2進数」では
・正数:0000 0000 ~ 0111 1111 = 0~127[10]
・負数:1111 1111 ~ 1000 0000 = -1~-128[10]
になります。
これから分かるように、
  3[10] = 「8ビットの符号付2進数」の 0000 0011
 -3[10] = 「8ビットの符号付2進数」の 1111 1101
  7[10] = 「8ビットの符号付2進数」の 0000 0111
 -7[10] = 「8ビットの符号付2進数」の 1111 1001
などのようになります。
同じ絶対値の「正数」と「負数」を足せば、
 1 0000 0000
となって、「8ビットの符号付2進数」では定義されない「9ビット目」に桁あふれするので、「8ビットの符号付2進数」の範囲内で考えれば「足し算結果が 0 になる数」つまり「同じ絶対値の正数と負数」になるわけです。
    • good
    • 0
この回答へのお礼

ありがとうございました

お礼日時:2021/10/06 11:50

先に言っとけば良かったかも知れないけど、符号付きで扱うのは、算術演算命令の場合に限る、と言う事。


算術演算命令の場合には、使われるハード回路自体が異なる。

なので、算術演算命令では無い様な、アドレス参照とか相対アドレスを扱う場合には8ビットコンピュータであっても10000000は128、10000001は129、11111111は255として扱われる。
    • good
    • 0
この回答へのお礼

知ってる

お礼日時:2021/10/06 11:38

>>これほんと?128だと思うのですが


タイプミス

>>では8ビットのコンピュータで128
→扱えない、127まで

>>32ビットのコンピュータで128と-128

+128:00000000 00000000 00000000 10000000
-128:11111111 11111111 11111111 10000000

>>64ビットのコンピュータで128と-128

32ビットの場合で、左に0を32個つけ足したら128
左に1を32個つけ足したら-128
    • good
    • 0
この回答へのお礼

> 8ビットのコンピュータで128→扱えない、127まで

これまたほんと?
0~255まで扱えると思いませんか?
わたしは使えると思ってました


確かに32ビットはこなりますね
11111111111111111111111110000000
00000000000000000000000010000000

でも、では32ビットでは
4294967168
128
をどう区別するのでしょうか?という堂々巡りにしかなりません

>+128:
>-128:

この表記が必ず付くなら分からなくもないですがつかないものもありますし
0と1しか表現できないメモリー上にはこんな表記はありませんよね

お礼日時:2021/10/06 11:46

2進でマイナスを扱う為には、何ビットコンピュータなのかを先に言う必要が有ります。

レジスタが何ビットなのかと言う事。
それが大前提。

単に、10000000と書いたら10進の1128です。
8ビットコンピュータで10000000なら、10進の-128です。
    • good
    • 0
この回答へのお礼

コンピュータは64ビットですが学校ではコンピューターのビット数まで考慮しろとは言われた記憶はありません
補足は計算するのが面倒なので確認のためにコンピューターを使っただけです

>単に、10000000と書いたら10進の1128です

これほんと?
128だと思うのですが

>8ビットコンピュータで10000000なら、10進の-128です。

では8ビットのコンピュータで
128

32ビットのコンピュータで
128と-128

64ビットのコンピュータで
128と-128

の違いをお答え願います

お礼日時:2021/10/06 11:17

質問の意味がよくわかりません。

何と何を区別するのですか?

8ビットの2進数で負数を2の補数で表現するとした場合、2進数の10000000は10進数の128です。
    • good
    • 1
この回答へのお礼

>質問の意味がよくわかりません。何と何を区別するのですか?

質問に対する最低限の知識も無い方の回答はお控えください

お礼日時:2021/10/06 10:57

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