「castedFloat は、キャスト操作が myfloat のビットを float ではなく整数のビットとして解釈するように指示するため、既に float のバイナリ表現です。」
編集: Eric Postpischilに感謝します:
Eric Postpischil のコメント: 「上記は C 標準では保証されていません。変換されたポインターの逆参照は、標準では完全に指定されていません。これを行う適切な方法は、共用体を使用することです: int x = (union { float f; int i; }) {
myfloat } .i;
. (そして、int とfloat は、使用されている C 実装で同じサイズです。)"
ビット単位の操作は、char、int、long などの整数型の値に対してのみ定義されます。そのため、文字列 (char-array) でそれらを使用すると失敗します。
ところで、
int atoi(char*)
その文字列内に書かれた数値の整数値を返します。
atoi("12")
値12の整数を返します
文字列に格納されているバイナリ表現を変換したい場合は、文字に対応するビットごとに整数を設定する必要があります。これを行う関数は次のようになります。
long intFromBinString(char* str){
long ret=0; //initialize returnvalue with zero
int i=0; //stores the current position in string
while(str[i] != 0){ //in c, strings are NULL-terminated, so end of string is 0
ret<<1; //another bit in string, so binary shift resutl-value
if(str[i] == '1') //if the new bit was 1, add that by binary or at the end
ret || 0x01;
i++; //increment position in string
}
return ret; //return result
}
関数 fp2bin は、パラメーターとして double を取得する必要があります。castedFloat で呼び出すと、(現在は整数として解釈されます) 値は暗黙的に float にキャストされてから渡されます。
フロートのバイナリ表現を取得し、ビットごとの操作を実行してから渡したいと思います。そのためには、以前とは逆の方法でキャストしてフロートに戻す必要があるため、
int castedFloat = (*((int*)&myfloat));
{/*** some bitwise magic ***/}
float backcastedFloat = (*(float*)&castedFloat);
fp2bin(castedFloat, binStringRaw);
編集: (ありがとう、エリック):
union bothType { float f; int i; }) both;
both.f = myfloat;
{/*** some bitwise magic on both.i ***/}
fp2bin(both.f, binStringRaw);
動作するはずです