7、15ビットのような奇数の単位でメモリに2進数のデータを格納すると2の補数のシステムはうまく機能しなくなります。ですので8、32ビットのように偶数の単位で2進数データは格納されるようになっています

solarplexuss「このエピソードは


2の補数というものを理解している必要がありますので


2の補数というものをお知りでない方は



https://kakuyomu.jp/works/1177354054881541562


   ☆天国にいけるC言語入門シーズン1☆


https://kakuyomu.jp/works/1177354054881541562



2の補数のエピソードをお読みください」



先のエピソードで


面白い現象が観測されました🌞



以下

そのときの文章を抜粋してみます。



☆ ☆ ☆


1000000000000000000000000000000(31ビット)の2の補数をもとめ


てみます。


まずは


0と1をひっくり返して


0111111111111111111111111111111


これに


1を足すと


1000000000000000000000000000000(31ビット)になります。


このように


1073741824の値を表す


1000000000000000000000000000000(31ビット)


の2の補数は


-1073741824の値を表す


1000000000000000000000000000000(31ビット)


であらわされます



ここで面白いことがおこっています。


どこがおかしいか?


お気づきになられましたか?


正解は


じゃじゃ~ん


この場合だと


1073741824も

-1073741824も


同じ


1000000000000000000000000000000(31ビット)


であらわされることになってしまうのです


こうなると


コンピュータに


1000000000000000000000000000000(31ビット)


メモリに格納されると


1000000000000000000000000000000(31ビット)は


1073741824を表しているのか


-1073741824を表しているのか


判断させることができなくなります。



1073741824の値を表す


1000000000000000000000000000000(31ビット)


の2の補数は


-1073741824の値を表す


1000000000000000000000000000000(31ビット)


なので


1073741824の値を表す


1000000000000000000000000000000(31ビット)


-1073741824の値を表す


1000000000000000000000000000000(31ビット)


を足し合わせると



1000000000000000000000000000000(31ビット)

1000000000000000000000000000000(31ビット)


=10000000000000000000000000000000(32ビット)


になり


(31ビット)同士の足し算では


計算結果も


(31ビット)に格納されるため


10000000000000000000000000000000(32ビット)の1

は消去されて


0000000000000000000000000000000(31ビット)になります


つまり


1073741824+(-1073741824)=0


になります


ところが

1073741824の値を表す


1000000000000000000000000000000(31ビット)


の2の補数である


1000000000000000000000000000000(31ビット)は


1073741824の値を表しているとなると


1073741824の値を表す


1000000000000000000000000000000(31ビット)

同じ


1073741824の値を表す


1000000000000000000000000000000(31ビット)


を足し合わせたなら


1000000000000000000000000000000(31ビット)

1000000000000000000000000000000(31ビット)


=10000000000000000000000000000000(32ビット)


になり


(31ビット)同士の足し算では


計算結果も


(31ビット)に格納されるため


10000000000000000000000000000000(32ビット)の1

は消去されて


0000000000000000000000000000000(31ビット)になります


つまり


正の数である

1073741824同士を足し合わせても


1073741824+1073741824=0


となります


31ビットのメモリに


数値1073741824を


10000000000000000000000000000000(31ビット)のように格納したため


10000000000000000000000000000000(31ビット)の2の補数



全く同じ2進数

10000000000000000000000000000000(31ビット)となってしまうことにより


このような現象がおこります


2の補数とは

大きさが同じで反対の符号をもつ2進数を表現するために

考え出されたものですが


31ビットのメモリに2進数を格納すると


10000000000000000000000000000000(31ビット)

2の補数である


10000000000000000000000000000000(31ビット)が


1073741824

と同時に

-1073741824

を表してしまうため


2の補数のシステムが

うまく機能しなくなります


一般に

7ビットや15ビットのような奇数のメモリに2進数のデータを格納すると


2の補数のシステムはうまく機能しなくなります


ですから


コンピュータのメモリには


8ビットや32ビットのように


偶数の単位で2進数のデータが格納されるようになっています。


1073741824なら


10000000000000000000000000000000(31ビット)でなく

0を先頭につけて

010000000000000000000000000000000(32ビット)


という具合にですね。


どうだったかな?


どうして


8ビットや32ビットのように


偶数の単位でメモリに2進数のデータが格納されるのか


わかったかな?😊」

  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます