アプリ版:「スタンプのみでお礼する」機能のリリースについて

情報科学基礎実験で用いる計算機では、intは32ビットである。そのため使
用できる整数範囲はー2の31乗~2の31乗ー1である。そのため範囲を超えた整数は計算機内でマイナスがつくんですが、どうしてでしょうか?
かなり急いでいるので誰か教えてください。

A 回答 (5件)

以下の説明はお使いのコンピュータと同じ「負の数が2の補数表現」という前提です。


世の中には「負の数が1の補数表現」であるコンピュータが少なからず存在します。

単純化するために4ビットのintで説明します。

4ビット表現可能な2進数は
0000,0001,0010,0011,0100,0101,0110,0111,
1000,1001,1010,1011,1100,1101,1110,1111
の16種類です。

0000(二)は明らかに0(十)です。
よって、これをベースに考えます。

1111(二)+1(二)の計算結果は10000(二)となり、前提である「4ビット」の範囲を超えます。
最上位の1ビットがオーバーフローとなり0000(二)となります。
結果、1111(二)+1(二)=0000(二)となります。
0000(二)は0(十)です。

見方を変えると
X+1(二)=0(十)
ですから
X=0(十)-1(二)
です。
Xは明らかに-1(十)です。
よって、1111(二)=-1(十)という考え方ができます。

しかし、この考え方を16種の2進数すべてに当てはめると
1111(二)=-1(十)
1110(二)=-2(十)
...
0010(二)=-14(十)
0001(二)=-15(十)
0000(二)=-16(十)
となってしまい「2進数を見ただけでは正負の判別ができない」という状況になります。
そこで『最上位のビットが1の時を負の数とする』というルールが付け加わりました。
0000(二)=0(十)
0001(二)=1(十)
...
0110(二)=6(十)
0111(二)=7(十)
1000(二)=-8(十)
1001(二)=-7(十)
...
1110(二)=-2(十)
1111(二)=-1(十)

7(十)+1(十)=-8(十)ということになります。
    • good
    • 0
この回答へのお礼

ありがとうございました。理解できました。

お礼日時:2002/12/03 14:46

一部間違い



>32ビットで表せる正数の場合
32ビットで表せる整数

>7FFFhを越えて
7FFFFFFFhを越えて

失礼しました。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2002/12/03 14:48

勘違いがあるようです。



>範囲を超えた整数は計算機内でマイナスがつくんですが、どうしてでしょう
か?

範囲を超えればオーバフローですからマイナス以外の印を付けるべきですね。
でも表現の手段が無いのでマイナスで代用しているのかもしれません。

32ビットのINTの表し方です。
頭の1ビットは符号を表すのに使います。(0:正、1:負)
数字のゼロは正の側のゼロを使います。

それで -(2^31)~0~(2^31-1)です。全部足すと2^32個です。
負の数は当然2の補数を使います。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2002/12/03 14:47

 32ビットで表せる正数の場合、実際に数字の部分は、31ビットで表し、32ビット目を、負数を表すビットとして使います。


 ですから、7FFFhを越えて、頭にビットが立ってしまうと、負数と判断してしまいます。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2002/12/03 14:46

計算機では、先頭の1ビットをフラグとして用いてます。


つまり、このビットが 1ならば、マイナスとして扱うのです。

だから、32ビットで扱える数の半分以上は、 マイナスになるということです。
    • good
    • 0
この回答へのお礼

ありがとうございました。

お礼日時:2002/12/03 14:48

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