プロが教える店舗&オフィスのセキュリティ対策術

16ビットの符号付固定小数点について

最上位(15)ビットが符号ビットで14~0ビットが少数部という
データフォーマットだった場合、-0,25を表すとしたら、
0.25に符号ビットをセットした値=0xA000( 1 010 0000 0000 0000 )
になるという考え方は正しいでしょうか

A 回答 (6件)

コンピュータ内部で一般に正負の数を固定小数点形式で扱う場合には2の補数形式で表されます。



小数点位置が何処にあるかは人が適当に仮定しますが、基本はCPUでの整数演算です。
その場合、16ビット表現では-32768...0...+32767が表されます。

最上位ビットの重みは-2**15=-32768,その他のビットの重みは右から0,1,2...n,..ビットは1,2,4,...2**n,...の重みを持っており、それらの各ビットの重みの和が表している数値となります。

負の数を表す場合、先ず正の数を考えてその1の補数を作り(全ビット1<==>0反転)最下位ビットに1を加えた形となります。

このようにしておけば加減算が正負の数を意識しないで統一的に処理出来るし、16,32,64ビットの固定小数点(整数も含む)の相互変換は最上位の符号ビットを左に拡張する、或いは上位の符号ビット部分を削除するなどで容易です。

質問に記されている小数点位置15ビットの-0.25は次のように表現されます。
0.25 = 0010 0000 0000 0000
同上1の補数形
   = 1101 1111 1111 1111 = 0xdfff
最下位ビットへの1の加算
   = 1110 0000 0000 0000 = 0xe000
以上のように表されます。

各ビットの重みを考えて十進数に戻すと、符号ビット=-1,
その右...のビットは1/2,1/4,1/8 の重みを持っているので
 -1 +1/2 +1/4 = -1 +3/4 = -1/4 = -0.25
のようになります。

加減算の場合は小数点位置が変わらず簡単ですが、乗算の時は16bit*16bit=32bitとなり、その結果を16bitの少数として求めるには32bit中のどの部分の16bitを取り出すかは人が意識してシフト演算で取り出す必要があります。

次等を参照下さい。
http://ja.wikipedia.org/wiki/コンピュータの数値表現
    • good
    • 0

訂正 


>答えはNo.2回答と同じになります
   ↓
 答えはNo.4 ninoue さんと同じになります。
    • good
    • 0

そのシステムが「2の補数」を使っているのなら、加減算は符号を意識しないでできるのだから、単純に 0-0.25 を計算してみれば良いんです。



(1)0000 0000 0000 0000
- 0010 0000 0000 0000
-----------------------
  1110 0000 0000 0000

最初に(1)と書いたのは、そのままでは引き算できないので、先頭に1があるものと仮定して計算します。この1はボロー(借り)として、CPUのキャリー/ボロー フラグに記録される数です。結果はNo.2回答と同じです。

ただ、実数計算の場合(浮動小数点実数計算の場合)、負数は単純に符号ビットを反転するだけのシステムもあるので、その場合は質問者さんの考えた通りになります。(たぶん固定小数点では、こんなシステムはないと思いますが。)
    • good
    • 0

う~む、どうなっているんだろう。


固定小数点に少数があるわけ無いでしょうに。整数ですよ。
-32768~32767までしか表せません。
浮動小数点であれば、指数と少数に分ける必要があります。

なお、符号ビットは符号だけで1ビットを使っているという考えは
誤りです。
16ビットでしたら 0x0000~0xffffまでの間、符号ビットがオンになる
コードを負数に割り当てていると考えるべきです。
割り当て方は色々ありますが、2の補数というのが今は固定していると思います。
つまり-1なら1の0x0001を反転して0xfffeとしプラス1し0xffffしたものが-1の
2の補数表現ということです。

もっとも、自分で専用のクラスでも作って、固定小数点で
データを保持するけども、小数部を持つという特殊なフォーマットに
することは可能です。
これはデータだけでなくクラス内のメソッドもフォーマットの一部と
言えるでしょうけど。
    • good
    • 0

> 最上位(15)ビットが符号ビットで14~0ビットが少数部という


> データフォーマットだった場合、

小数点をどこで固定するか?なんかによってフォーマットは変わりますから、


> -0,25を表すとしたら、
> 0.25に符号ビットをセットした値=0xA000( 1 010 0000 0000 0000 )
> になる

必ずそうなるなんて保証が無いです。

前提条件として、表す数は1未満の小数で、14ビット=1/2、13ビット=1/4とかって事になってるのなら合ってるって事になるかも知れません。


> 16ビットの符号付固定小数点

って条件だけだと、
15ビット:符号、14ビット~8ビット:整数部、7ビット~0ビット:小数部
15ビット:符号、14ビット~12ビット:整数部、11ビット~0ビット:小数部
15ビット:符号、14ビット~0ビット:数値部(小数部)、表す数は-0.32768~+0.32768の0.00001刻み
どんなのだってあり得ます。
    • good
    • 0

 残念ながら違いますね。



 符号付固定小数点というのは、符号(1ビット):整数部(8ビット):小数部(7ビット)という具合に並べて、全部で16ビットです。

 詳しくは以下のリンクを参照してください。

参考URL:http://www2.muroran-it.ac.jp/circle/mpc/front/ol …
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!