1

私のCコードに少し問題がありました。符号、指数、仮数を抽出しようとしています。これまでのところ、符号と指数でうまくいきました。問題は仮数から始まります。たとえば、-5.0を見てみましょう。符号は1ビット、指数は8ビット、仮数は23ビットです。これは-5.0のバイナリ表記です:

1 10000001 0100000000000000000000

1 = 符号

10000001 = 指数

01000000000000000000000 = 仮数。

仮数のビットを戻したい。

static int fpmanitssa(uint32_t number) {

   uint32_t numbTemp = 8388607;
   number = number & numbTemp;  //bitwise AND, number should be 2097152.

   int numbDiv;
   int leftover;
   char resultString[23];
   size_t idx = 0;

   do {
       numbDiv = number/2;
       leftover = number % 2;
       resultString[idx++] = leftover;
       number = numbDiv;
   } while (number != 0);

 return resultString;

結果として得られるのは負の数です。なぜ機能しないのかわかりません。問題を見つけるのを手伝ってくれませんか?

よろしく萩

4

3 に答える 3

1

1) 浮動小数点数には仮数部 (対数目盛) ではなく仮数部 (線形目盛、小数部分とも呼ばれます) があります。

2) 関数は を返すように宣言されていますが、 の配列であるintを返そうとしています。の配列は ではなく、自動的に に変換できません。resultStringcharcharintint

3) return を実行した場合、 の有効期間は関数実行中の時間のみresultStringであるため、失敗します。resultString関数が戻った後は使用できません。関数から文字を返す場合は、呼び出し元が適切なサイズの既存の配列を渡すように宣言するか、関数が配列を動的に割り当て ( のようにmalloc)、そのアドレスを呼び出し元に返すように宣言する必要があります。最終的には割り当てを解除します (でfree)。

4) 符号化された仮数部のビットを含む を返しint、下位ビットに符号化された仮数部を持つ符号number化された浮動小数点数が含まれている場合は、AND 演算で上位ビットを削除して返すだけです。下位ビット。

5) char の配列が数値ビットではなく印刷可能な数字を形成する'0'場合は、整数 0 または 1 から文字「0」または「1」に変換するために、各ビットに追加する必要があります。この場合、 の最後にヌル文字が必要になることもありますresultString

resultString6) ビットは、下位ビットから上位ビットの順に割り当てられます。これは、resultString後で印刷する場合は、必要な順序とは逆の場合があります。resultString(印刷ではなく、計算のみに使用する順序であれば問題ないかもしれません。)

7) 上記は、浮動小数点エンコーディングの明示的なビットである、エンコードされた有意桁のみを返したいと仮定しています。暗黙のビットを含めて、表現された仮数を返したい場合は、24番目の位置が必要です。指数がゼロ以外の場合は 1、それ以外の場合は 0 です。(もちろん、数値が NaN や無限大ではないことを前提としています。)

于 2013-05-17T17:16:57.683 に答える