天国にいけるC言語入門 ヘキサ構造体 ver5.2130
7、15ビットのような奇数の単位でメモリに2進数のデータを格納すると2の補数のシステムはうまく機能しなくなります。ですので8、32ビットのように偶数の単位で2進数データは格納されるようになっています
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ビット)
と
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進数のデータが格納されるのか
わかったかな?😊」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます