0

組み込みデバイスから、64 ビット整数を表す 4 つの 16 ビット レジスタから読み取ります。読み取り関数はそれらを uint16_t で読み取り、それを float 32 に変換したいと考えています。このようにキャストすると、左シフト カウント >= タイプの幅 [デフォルトで有効] という警告が表示されます。

uint16_t u1,u2,u3,u4;
u1=readregister();
u2=readregister();
u3=readregister();
u4=readregister();

float num11 = (float) (u1 << 48);       
float num22 = (float) (u2 << 32); 
float num33 = (float) (u3 << 16);   
float num44 = (float) u4;   
float numm= num11+num22+num33+num44;
printf("%f\n", numm);

精度はどうですか?

4

2 に答える 2

2

それを行う1つの方法は次のとおりです。

#include <math.h>

float numm = (float) u4 + ldexpf(u3, 16) + ldexpf(u2, 32) + ldexpf(u1, 48);

これは、組み込みコンパイラがすでに持っている以外の整数サイズを提供する必要はなく、必要なのは。uint16_tだけldexpf()です。

これfloatは、シフトされた整数の数学的合計の1 ULP内にあるaを計算しますu1、… u4、。

于 2013-02-19T20:29:21.533 に答える
2

このようにしてください:

float num11 = (uint64_t) u1 << 48;
/* ... */

uint64_tへの変換のためにコンパイラが警告する場合 (C では必要ありません) float、追加のfloatキャストを追加できます。

float num11 = (float) ((uint64_t) u1 << 48);

これで警告が消えます。

効率と精度の理由から、最初に 4uint16_tを1 に変換し、次に からへuint64_tの 1 つの変換を実行すること をお勧めします。uint64_tfloat

于 2013-02-19T20:23:08.100 に答える