3

float をバイナリに変換する関数 ( http://www.exploringbinary.com/converting-floating-point-numbers-to-binary-strings-in-c/からコードを借用) を使用しています。char に格納されます。ただし、結果に対してビット単位の操作を実行できる必要があるため、必要に応じてビットをシフトできるように、文字列を取得して整数に変換する方法を見つけようとしています。私は atoi() を試しましたが、-1 を返すようです。

これまでのところ、私は持っています:

char binStringRaw[FP2BIN_STRING_MAX];
float myfloat;

printf("Enter a floating point number: ");
scanf("%f", &myfloat);
int castedFloat = (*((int*)&myfloat));
fp2bin(castedFloat, binStringRaw);

入力が「12.125」の場合、binStringRaw の出力は「1000001010000100000000000000000」になります。ただし、これに対してビット単位の演算を実行しようとすると、「無効なオペランドがバイナリ式 ('char[1077]' および 'int')」になっています」というエラーが発生します。

PS - これが簡単な質問であるか、私のコードに一般的な問題がある場合はお詫び申し上げます。私はPythonから来たCプログラミングに非常に慣れていません。

4

1 に答える 1

2

「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);

動作するはずです

于 2013-03-03T22:37:11.867 に答える