こんにちは、私は16ビットC環境で作業しており、浮動小数点値を整数値などのビットシーケンスに変換したいと考えています。これを達成する方法を私が知っている方法は複数あります。1つは組合を利用する方法です。そのような:
union ConvertFloatToInt
{
float input;
unsigned long output;
};
これは、同じメモリ領域を読み取り、それを異なる方法で解釈することにより、浮動値を長い値に「変換」します。
union ConvertFloatToInt x;
x.input = 20.00;
結果
x.output = 0x41A00000;
他のメソッドはvoidポインタキャストです...
float input = 40.00;
unsigned long output;
void* ptr;
ptr = &input;
output = *(unsigned long*) ptr;
結果
output = 0x42200000;
これは私がやろうとしていることのアイデアですが、実行時ではなくビルド中にコンパイラに変換を実行してもらいたいです。
変換された浮動データを定数(const)unsignedlongに挿入する必要があります。
float値をvoidに変換し、次にvoidをunsignedlongに変換しようと考えていました。このようなもの:(そして、はい、これは正しくありません、あなたはボイドにキャストすることはできません)
const unsigned long FloatValue = (unsigned long) ((void) ((float) 20.654));
これを行う方法はありますか?私はおそらくvoidポインターで何かを考えていましたが、私が知っているすべてのvoidポインターには変数が必要であり、変数はconst値の割り当てに使用されない場合があります。
編集
私はC90コンパイラを使用しています。質問はファイルスコープを対象としています。
結論
結論は、ブロックスコープで作業する場合を除いて、この質問に対する実際の解決策はないということでした。複数の回答がありましたので、よろしくお願いします。
私の解決策
これは良い解決策ではありませんが、私の問題は解決しますが、これが多くの人々に役立つとは思いません。デモンストレーション用の小さなプログラムを作成しました。これは私のプロジェクトコードではなく、私のプロジェクトで使用されているコンパイラでもありません(誰かがこれはC90コンパイラではないと言う前に)
デモンストレーションで使用されたコンパイラ:gcc(Ubuntu / Linaro 4.6.3-1ubuntu5)4.6.3
typedef union
{
float myfloat;
unsigned long mylong;
} custom_type;
typedef struct
{
int a;
int b;
custom_type typeA;
custom_type typeB;
} my_struct;
const my_struct myobj =
{
1,2,3.84F,4
};
int main(void)
{
printf(":: %f\n", myobj.typeA.myfloat);
printf(":: %ul\n", myobj.typeA.mylong);
return 0;
}
出力
:: 3.840000
:: 1081459343l
これは少し大雑把ですが、ファイルスコープでは機能します(ただし、警告が生成されます)。