某博士課程のblog 2

私立6年制薬学部卒,博士課程進学者のblogです.記事の前にカテゴリ中のprofile(随時更新)をご覧いただきたいと思います.

薬学生がコンピュータ科学を独学する/2の補数記法とオーバーフロー

S in ASCII

 

入門 コンピュータ科学 ITを支える技術と理論の基礎知識

入門 コンピュータ科学 ITを支える技術と理論の基礎知識

 

 

今日は予告通り,上記の書籍で学んだことを復習がてら紹介したいと思います.

現在2の補数記法がコンピュータへの整数の格納に使用されています.

(他にもいろんな記法があるみたいですが,今日はそのうちの1つを紹介します)

これを勉強するとコンピュータエラーの原因の1つが分かって少し楽しいのです.

電卓なんかで,あるケタ以上計算できないってありますよね.

コンピュータのメモリの限界のしくみが少し分かった気になります.

 

さて,この2の補数記法を学ぶ前に,まず2進法を簡単に知っておく必要があります.

 

我々が普段使用しているのは,10進数です.

人間が指で10まで数えたからだと言われていますが,

10になったらケタがあがるんですね.

 

0から9まで数えて,次は9を消して0に戻して,左側に1を足して10と書く.

これが2進数だと0,1と数えたところで0に戻して左に1を足して10と書きます.

2進数の10と10進数の10は違うのです.

10の次は11,その次は100,101,110,111,1000となります.

 

順番に数えるには,なかなか慣れが必要そうです.

 

さて,今日のコンピュータで整数を表現する最も一般的な体系は,2の補数記法です.

この表記法では,体系中の各値を表現するのに固定長のビット列を使用します.

今日の装置(例えば電卓)では各値を32ビットのパターンとして表現する2の補数体系が一般に使用されています.

1ビットは(0か1)です.2ビットで2ケタ目を表現します.

 

書籍では3ビットを例として挙げています.

 枠内を見ながらの方が分かりやすいかと思います.

000からはじめて,最左端の0の後にすべて1が続くパターンを得るまで2進法で

数えて行きます.これらのパターンは値0,1,2,3を表現します.

負の値は111からはじめて,最左端の1の後にすべて0が続くパターンを得るまで

2進法で逆に数えて行きます.

これらのパターンは-1,-2,-3,-4を表現しています.

 

3ビット                 4ビット

ビットパターン/表現する値   ビットパターン/表現する値

011 / 3              0111 / 7

010 / 2                                                        0110 / 6

001 / 1                                                        0101 / 5

000 / 0                                                        0100 / 4

111 / -1                                                      0011 / 3

110 / -2                                                      0010 / 2

101 / -3                                                      0001 / 1

100 / -4                                                      0000 / 0

                                                                    1111 / -1

                                                                    1110 / -2

                                                                            : 

                                                                    1010 / -6

 2の補数記法では最左端のビットは値の符号を表しています(符号ビット)

また,絶対値が同じ正の値と負の値(例えば2と−2)を表現する

ビットパターン間には簡潔な関係があります.

右から左に歩みを進めていくと最初の1に至るまでは同一であり,

そこから先は0と1が互いに補なパターンです.

 

ここから2の補数表現を解読するアルゴリズムが得られます.

 符号ビットが0であれば,(0110の場合)

そのまま符号ビットを除いて2進法で数えればいい.

2進法の110は,10進法では6です.

符号ビットが1であれば,(1010の場合)

右から数えて最初の1まではそのまま書いて,次からは反転させます(0110)

これが6なので,1010はー6となります.

 

この記法の長所として,加算と減算を同じアルゴリズムでこなせるというところです.

例えば減算問題7−5は,加算問題7+(−5)と同じです.

したがって装置が7(0111として格納されている)から5(0101として格納されている)を引かなければならないとしたら,まず5を−5(1011)に変換して,

その上で加算すればいい.

加算回路と値を負にする回路があれば,加算と減算の問題を解く事ができて便利なのですね.

 

ですが,2の補数体系には弱点があります.

表現できる値のサイズに限界があります,

上の枠内の4ビットパターンで最大の正の整数は7であり,最小の負の数は−8です.

つまり5+4の正解である値9は得られません.

実際に計算してみると,結果は−7と表現されてしまいます.

このような現象をオーバーフローと呼ぶらしいです.

もちろんほとんどのコンピュータは32ビットと長いパターンを使用しているので,

簡単にオーバーフローはしませんが,このような理由でコンピュータの計算には限界があるようです.

 

お分かりいただけたでしょうか.

教科書からだいぶ省いた説明ですので,

洋書にみられる巧みな表現ができていないかもしれません.

興味がありましたら,書籍の購入をお勧めします.

3800円はこの手の本にしては安いと思います.

 

実は独学でいろいろと作りたくて

こんな本に手を出している薬学生です.

これから少しずつコンピュータ科学を学んでいく予定です.

 

以前初めて購入したPIC(12F683)は8ビット(1バイト)なのですね.

ド素人の医療学生がPICマイコンでLEDを点滅させる!悪戦苦闘の4時間 - 某博士課程のblog 2

つまり今回の2の補数記法では2の7乗(128で計算あってる?)

までしか計算できないと!

貧弱すぎる!

んなわけないよなぁ・・・

なんだろう

自分の知らない事情がありそうだ(もしくは勘違いか)

これからゆっくり探っていくとしますか

楽しみすぎる.

早く国家試験終わってほしいな・・・

 

2の補数記法初めて知った!

って人は下記バナークリックお願いします><

 

にほんブログ村 大学生日記ブログへ
にほんブログ村