2017-07-13 16 views
0

アセンブリ言語とそのデータ型を勉強していて、.floatに遭遇しました。私はFloatという名前の変数.floatを宣言し、その値に10.23を割り当てました。私はそれをアセンブルするためにGNUアセンブラv2.28を使い、次にGNUリンカv2.28を使ってオブジェクトファイルをリンクして実行可能なバイナリを作成しました。ここに私のプログラムはあります:アセンブリ言語での浮動小数点の表現

.data 
    HelloWorld: 
     .ascii "Hello World!\n" 
    ByteLocation: 
     .byte 10 
    Int32: 
     .int 2 
    Int16: 
     .short 5 
    Float: 
     .float 10.23 
    IntArr: 
     .int 3,6,7,8,10 

.bss 
    .comm LargeBuffer, 1000 

.text 
    .globl _start 
    _start: 
     nop  
     movl $1, %eax 
     movl $0, %ebx 
     int $0x80 

私はGDBデバッガを使ってブレークポイントを設定しました。

(gdb) break *_start+1 Breakpoint 1 at 0x4000b1: file 03 VariableDemo.s, line 22.

そして私は、10進数表現とFloatのバイナリ表現を見たとき。私は戻って10.23にバイナリ表現を変換するCan anyone explain representation of float in memory?を参照しています

(gdb) x/1bw 0x0000000000600139 0x600139: 10.2299995 (gdb) x/1tw 0x0000000000600139 0x600139: 01000001001000111010111000010100

:私はこれを見つけました。ここに私の計算です:

最初のビット= 1 =>浮動小数点は正です。

次の8ビット= 10000010 =>正数の乗数として+2を表します。

次の23ビット= 01000111010111000010100 => 2の負のパワーと変換されるとき0.278749943

しかし0.278749943 * 2を与えるが10.23ではありません。だから今私は2つの質問に留意しています。

  1. テキストの10.23がメモリ内で10.2299995と表示されるのはなぜですか。
  2. どこで計算がうまくいかなかったのですか?
+0

の場合1.お読みください:http://floating-point-gui.de/ – Ped7g

答えて

3
  1. 変換エラー、ベース10に「素敵」ではありませんすべてはつもりベース2
  2. にいいことしているではない+2
  3. +3ですので、指数のバイアスは、127ない128ですそれはちょうど*2
  4. *2^3ではありませんので、あなたが実際にあなたが暗黙のリード1ビットを忘れてしまったので、あなたは、仮数部に1を追加する必要があり、あなたが1.278749943*2^3=10.2299995
  5. を持っている意味、指数を使用する必要があります
+0

2番目の点を詳しく教えてください。 –

+0

格納されている指数が130で、あなたが+2を意味すると主張しましたが、実際には+3を意味します。なぜなら、128でなく127を引く必要があるからです。 org/wiki/Single-precision_floating-point_format)(そしてあなたのコンピュータ)は正しいです。 – Jester

+0

説明をありがとう! –

0

仮数の先頭に暗黙の1があるため、常に1.xxxxxxxバイナリです。次に、指数にしたがって左シフトまたは右シフトされます(指数は2の補数の2進数ではなくバイアスされているため、127はゼロシフトに等しいか、または1.xxxxx、128は1x.xxxxなどを表します)。

最後に、出力のためにバイナリがdenaryに変換されます。

関連する問題