0

整列された配列uint8[8]をに変換しようとすると、少し難しい問題に直面していdoubleます。ビット演算で変換するのは特に簡単でしたが、符号ビットの点で厄介になる可能性があることを理解していuint8[4]ますか?longdouble

Javaでは単純に使用しますByteBuffer.wrap(bytes).getDouble()が、Cではそれほど簡単ではないと思います。

このコードを実装しようとしましたが、最後のコマンドでエラーが発生Expression is not assignableし、Shift count >= width of type

long tempHigh = 0; 
long tempLow = 0;
double sum = 0;
tempHigh |= buffer[0] & 0xFF;
tempHigh <<= 8;
tempHigh |= buffer[1] & 0xFF;
tempHigh <<= 8;
tempHigh |= buffer[2] & 0xFF;
tempHigh <<= 8;
tempHigh |= buffer[3] & 0xFF;

tempLow |= buffer[4] & 0xFF;
tempLow <<= 8;
tempLow |= buffer[5] & 0xFF;
tempLow <<= 8;
tempLow |= buffer[6] & 0xFF;
tempLow <<= 8;
tempLow |= buffer[7] & 0xFF;

sum |= ((tempHigh & 0xFFFF) <<= 32) + (tempLow & 0xFFFF);

この手順を正しく実行するにはどうすればよいですか、または私が犯したエラーを解決するにはどうすればよいですか?

前もって感謝します。

4

3 に答える 3

3

double浮動小数点型です。などのビット演算はサポートされていません|

あなたは次のようなことをすることができます:

double sum;

memcpy(&sum, buffer, sizeof(sum));

ただし、エンディアンの問題に注意してください。

于 2012-05-02T13:48:25.037 に答える
2

組合はどうですか?あなたが持っているように長い部分に書いてください、そうすればダブルは自動的に正しいです。このようなもの:

union 
{
   double sum;
   struct
   {
       long tempHigh;
       long tempLow;
   }v;
 }u;

 u.v.tempHigh = 0; 
 u.v.tempHigh |= buffer[0] & 0xFF;
 u.v.tempHigh <<= 8;
 u.v.tempHigh |= buffer[1] & 0xFF;
 u.v.tempHigh <<= 8;
 u.v.tempHigh |= buffer[2] & 0xFF;
 u.v.tempHigh <<= 8;
 u.v.tempHigh |= buffer[3] & 0xFF;

 u.v.tempLow |= buffer[4] & 0xFF;
 u.v.tempLow <<= 8;
 u.v.tempLow |= buffer[5] & 0xFF;
 u.v.tempLow <<= 8;
 u.v.tempLow |= buffer[6] & 0xFF;
 u.v.tempLow <<= 8;
 u.v.tempLow |= buffer[7] & 0xFF;

 printf("%f", u.sum);
于 2012-05-02T14:18:41.837 に答える
2

これを行うための移植可能な方法は、符号、指数、および仮数の値をビット単位の演算で整数変数に読み取り、次に呼び出しldexpて指数を適用することです。

OK、ここにいくつかのコードがあります。かっこが一致していないか、1つずつエラーが発生している可能性があることに注意してください。

unsigned char x[8]; // your input; code assumes little endian
long mantissa = ((((((x[6]%16)*256 + x[5])*256 + x[4])*256 + x[3])*256 + x[2])*256 + x[1])*256 + x[0];
int exp = x[7]%128*16 + x[6]/16 - 1023;
int sign = 1-x[7]/128*2;
double y = sign*ldexp(0x1p53 + mantissa, exp-53);
于 2012-05-02T17:38:45.527 に答える