【FE2問】「固定小数点」形式(基本情報技術者試験)
数値はコンピュータには2進数データとして記録されます。
私たちは、「2」とか「2.5」とか「-2」とか「-2.5」とか気軽にメモをするんですが、コンピュータではいろんな記録形式があります。
そもそも数値には、「正の数」「負の数」「整数」もあれば「小数」もありますね。
正負の記録には、符号部(0なら正、1なら負)を1ビット設けたり、補数を導入した表現があります。>補数の解説Note
また整数なら「10進数の2」を「2進数の10」として、小数を含む実数なら「10進数の2.5」を「2進数の10.1」として記録します。
今回は小数部のある実数の記録方法「固定小数点」形式を学びます。
なお実数の記録は、「固定小数点」形式だけでなく「浮動小数点」形式もあります。>浮動小数点の解説Note
「固定小数点」形式は「浮動小数点」形式よりも簡単なので、ぜひ得点できるようになってくださいね。
それでは始めましょう!
「固定小数点」形式
「固定小数点」形式は、小数点の位置が決まっている数値表現です。
まずコンピュータは2進数を使うので、「10進数の5.5」を2進数に変換しましょう。
整数部と小数部に分ける:5.5→5と0.5
整数部を変換する(割り算の方法):5→101
小数部を変換する(掛け算の方法):0.5→0.1
整数部と小数部を結合する:101 + 0.1 = 101.1
さて、問題文より「小数点位置は3と4ビット目の間」「0ビット目から数える」なので、整数部は0~3ビット目の4桁・小数部は4~7ビット目の4桁です。
よって、0101.1000とし、ビット列は01011000です。
問題演習 | 補数と絡める
負の数は補数表現を用いることが多いです。
引き算を足し算で実現できるので、コンピュータは加算回路だけ用意すれば良いですから。>補数の解説Note
今回の問題では、補数変換をするタイミングに注意してください。
正答はウ。
流れは以下3段階です。
5.625を2進数に変換する
整数部4桁、小数部4桁に整形する
負の数なので、5.625の2進数を補数に変換する
桁数の整形をした後に補数変換をするのが注意点。
なぜなら、補数変換では各桁をビット反転を行うため、1を反転すれば「0」ですが、01を反転すれば「10」のように結果が全然違ってきます。
まずは、5.625を2進数に変換します。
整数部と小数部に分ける:5.625→5と0.625
整数部を変換する(割り算の方法):5→101
小数部を変換する(掛け算の方法):0.625→0.101
整数部と小数部を結合する:101 + 0.101 = 101.101
次は、整数部4桁、小数部4桁に整形します。
101.101→0101.1010
最後に-5.625は負の数なので補数に変換します。
各桁をビット反転する:0101.1010→1010.0101
(最下位ビットに)+1する:1010.0110
したがってビット列は「1010 0110」。
問題演習 | 表現範囲
正答はイ。
正の数のみならば簡単だが
補数を使わなければ、正の数のみなので以下になります。
最大値:1111 1111 1111 1111:FFFF
最小値:0000 0000 0000 0000:0000
しかし負の数が表現できる場合は、負の数が最小値になり、補数表現を考えて特定せねばなりません。
補数のビット列の傾向
2ビットの場合の補数の表現範囲を図示します。
最小値は、「2進数の10」。補数であり「10進数の-2」の役割を持ちます。
図の2進数をじっとみると、16ビットの最小値は「1000 0000 0000 0000」かなと推測できます。
解き方1
補数「1000 0000 0000 0000」が10進数でいくつなのか。なお、小数点の位置は明記がないため、とりあえず右端として整数のみと考えてOKです。
補数を「普通の数」に変換する手順は、「普通の数→補数」の手順と同じ。不思議ですね。
各桁ビット反転して:0111 1111 1111 1111
(最下位に)+1して:1000 0000 0000 0000
最後に16進数に変換します。
2つの方法がありますが、2つ目を薦めます。
2進数→10進数→16進数
2進数4桁→16進数1桁
2進数の「1000 0000 0000 0000」を4桁ずつ16進数1桁に変換して「8 0 0 0」。よって正答はイ「8000」。
解き方2
各選択肢の値を比べてみましょう。
まずは16進数から2進数にして、補数かどうか見ます。最上位ビットが「1」なら補数です。>補数の解説Note
ア:7FFF:0111 1111 1111 1111:正の数
イ:8000:1000 0000 0000 0000:補数(負の数)
ウ:8001:1000 0000 0000 0001:補数(負の数)
エ:FFFF:1111 1111 1111 1111:補数(負の数)
この時点で、アは正の数、イ~エが負の数なので、最小値はイ~エのどれかです。
イ~エの値を比べるために、補数から「普通の数」に変換します。
イについて。1000 0000 0000 0000→0111 1111 1111 1111→1000 0000 0000 000:10進数の2^15なので、「-2^15」
ウについて。1000 0000 0000 0001→0111 1111 1111 1110 →0111 1111 1111 1111:イより1だけ絶対値小さいので、2^15 -1、「-2^15+1」。負の数なので+1です。「-4」を「-3」にするようなもの。
エについて。1111 1111 1111 1111→0000 0000 0000 0000→0000 0000 0000 0001:10進数の1なので、「-1」。
したがって、イが最小値。
固定小数点の問題というよりは、補数の表現範囲の問題でしたね。
補強 | 小数点位置を考えなくて良かったのか
「解き方1」で「なお、小数点の位置は明記がないため、とりあえず右端として整数のみと考えてOKです」と書きましたが、少し考えてみます。
簡単のため4ビット、補数表現なし(正の数のみ)で考えます。
最小値:0000:10進数の0
最大値:1111:10進数の15
では小数点位置が、3ビット目と4ビット目の間だったら。
最小値:000.0:10進数の0
最大値:111.1:10進数の7.5
このように、最小値と最大値のビット列はそのままで、意味する値だけが変動し、大小関係はそのままです。
16ビットの時も、小数点位置がどこであろうと最小値のビット列は同じなので、小数点位置を勝手に決めて解きました。
まとめ
お疲れ様でした!
固定小数点表示は簡単なので、16進数や補数を絡めて難易度を高める小細工をしている印象でしたね。
「補数」は少しハードルがありますが、ラスボスの浮動小数点よりはマシなので、少しでも解けるようになってくださいね。
他にも計算問題のNoteはたくさん公開していますので、興味があったら覗いていってくださいね。
それでは!
\力試しは修了試験で!4回分の解説です/
p.s. 普段は >> 専門学校とIT就職のブログ << をやってます。
でわでわ(・ω・▼)ノシ