IEEE float hex 42F6E979 がある場合、どうすればそれを 10 進数に変換できますか? 小数表現は = 123.456001 だと思います
4 に答える
(ほとんどの)アセンブリ言語は実際には型をそれほど強く強制しないので、その値で場所を初期化してから、それをfloatとして扱う/使用することができます。変換する最も簡単な方法は、通常、次のようなものです。
.data
myfloat dd 042F6E979H
mydec db 10 dup(?)
.code
mov ebx, offset mydec
fld myfloat
fbstp [ebx]
これは実際には2進化10進数を生成するため、表示するには各バイトを2桁に分割する必要があります。もちろん、これはx86用です。他のほとんどのアーキテクチャでは、作業が少し難しくなります。たとえば、PowerPCにはfctiw
、整数に変換するだけのがあります(x86と同じ一般的な順序でfist
)。これを使用するには、通常、10の倍数を掛けて必要な小数点以下の桁数を取得し、整数に変換して、結果の正しい位置に小数点を置きます。1)浮動小数点数の範囲の限界に近づいている場合、または2)単一の整数で表現できるよりも高い精度が必要な場合は、少し醜くなる可能性があります。
独自のコードをテストしている間に、このオンライン ツールを使用して回答を確認できます。参考までに、小数が 123.45 であるという点で正しいです...
ウィキペディアにも役立つ記事があります。
ウィキペディアを参照するか、環境に既に存在する可能性があるライブラリ ルーチンを呼び出します。それはしばしば再発明される車輪です
あなたが言語を提供していないので、私はこれを C で行います。
char hex[];
int *ptr;
for(int i = 0; i < 8; ++i)
{
&ptr += toNumber(hex[i]) << (i * 4);
}
float *value = (float*)ptr;
toNumber 関数の記述は OP に任せます。