基数変換と 2 の補数
あなたのデータ
先頭の 0b、0o、0x は受け付けたうえで無視されます。桁のあいだの空白やアンダースコアも同様です。
結果
選んだ読み方でのこのビット列の値
—
| まったく同じビットを、もう一方の読み方で | — |
| 2 進法で | — |
| 16 進法で | — |
| 8 進法で | — |
| この幅に収まる範囲すべて | — |
符号を反転する手順
| まずビット列 | — |
| すべて反転する | — |
| 1 を足す。これが負の数 | — |
| つまり | — |
ビットを反転して 1 を足すことは、2 のビット幅乗から引くことと同じで、8 ビットの 256 通りすべてで確認しました。2 回行えば必ず元に戻り、この性質が仕組み全体を成り立たせています。
このページは、ふつうの浮動小数点ではなく、大きさに制限のない整数で計算します。おおよそ九千兆を超えると、ふつうの型は値を飛ばしはじめるからです。2 の 53 乗に 1 を足しても 2 の 53 乗のままになります。64 ビットでは、それが黙って誤った答えを出すことになります。
なぜ 200 がマイナス 56 になるのですか。
200 とマイナス 56 は同じ 8 ビット、11001000 だからです。そのビット列のどこにも、どちらのつもりだったかは書かれていません。ビット幅と読み方は別の場所で、プログラムを書いた人が決めており、ビットのほうはどちらの答えにも付き合います。
違いのすべては、いちばん左のビットです。それが 0 のあいだは 2 つの読み方は完全に一致します。だからこそ、値が半分を越えるまで食い違いは表に出てきません。
なぜ範囲がマイナス 128 から 127 で、マイナス 127 から 127 ではないのですか。
ゼロもどこかに置かねばならず、その置き場は正の側だからです。8 ビットには 256 通りの並びがあり、そのうち 1 つをゼロが使うので、残り 255 を分け合います。分け方は正が 127、負が 128 で、負の側が 1 つ多くなります。
どのビット幅でも同じです。16 ビットはマイナス 32768 から 32767、64 ビットはマイナス 9223372036854775808 から 9223372036854775807 までです。
反対の符号を持たない数はありますか。
あります。ビット幅ごとにちょうど 1 つ、いちばん小さい負の数です。8 ビットのマイナス 128 には正の双子がいません。128 には、正の側が持っていない席が必要になるからです。
10000000 のビットを反転すると 01111111 になり、1 を足すと 10000000 に戻ります。符号を反転しても同じ数が返ってくるのです。このページはそれを隠さずに見せます。この性質は 8、16、32、64 ビットで確認済みです。
数が収まらないときはどうなりますか。
折り返します。このページは拒否せず、その折り返しを表示します。8 ビットに 300 を書けば 44 が入り、マイナス 129 を書けば 127 が入ります。
ページが甘いのではなく、ハードウェアがそうするのです。エラーを出してしまえば、あなたがおそらく理解しに来た不具合の原因そのものを隠すことになります。
反応
0
0 コメント
最初にコメントする