簡體   English   中英

如何將浮點數轉換為無符號變量?

[英]How to convert floating-point to unsigned variable?

有人可以幫我有關浮點變量的字節排序嗎? 實際上,該代碼在Solaris上可以正常工作,但在Windows Xp上卻不能正常工作。 這是我的代碼的一個示例:....

 int x_snd=1;
 float y_snd=1.13;
 struct {
      int xx_snd;
      float yy_snd;
    } data_snd;
 int x_rec;
 float y_rec;
    struct {
      int xx_rec;
      float yy_rec;
    } data_rec;  

 //marshalling 
 data_snd.xx_snd=htons(x_snd);
 data_snd.yy_snd=htonl(*(int*) &y_snd);

 //write data to socket
 send(sock1, &data_snd, ...

 //clean ...

 //read data from socket
 if recv(sock, &data_rec ...

  //unmarshalling
  x_rec=ntohs(data_rec.xx_rec);
  y_rec= *(float*) &(ntohl(data_rec.yy_rec));

...

代碼在Unix上使用gcc編譯,在wndows上使用MSVC ++ 6編譯。 您的任何幫助將不勝感激,如果您可以將我定向到任何提供有關字節序有用信息的鏈接或文檔,我將非常高興...

預先感謝您的幫助,mk

這通常是個壞主意。 即使考慮了字節順序,浮點數的格式在不同的硬件上也不一定相同。 我將建議您在這里和那里以字符串形式運送它們。

浮點格式中存在更多的潛在多樣性和問題,而不僅僅是在編組和解組整數時要處理的字節序問題。

一種解決方法是使用printf將浮點數格式化為文本,並使用strtof()讀回它們(如bmargulies所示)。

只要機器共享相同的FLT_RADIX值,另一種可行的方法是將它們分成尾數和指數值:

#include <math.h>
#include <limits.h>

float x = 1.13;
int x_exp;
long x_mant;

x_exp = ilogbf(x);
x_mant = (scalbnf(fabsf(x), -x_exp) - 1) * LONG_MAX;
if (x < 0.0)
    x_mant = -x_mant;

然后,您需要將一個int和一個long (上面的代碼中的x_expx_mant )放置到線路上,您可以使用常規的ntohl()htonl()函數來完成此操作。 要將它們轉換回float ,請使用:

x = scalbnf((fabsf(x_mant) / LONG_MAX) + 1, x_exp);
if (x_mant < 0)
    x = -x;

請注意,大多數計算機的FLT_RADIX值(在float.h定義)為2,因此,如果在編譯過程中檢查該值,並在其他情況下中止該值,則應該具有可移植性。

假設兩個系統具有相同的浮點格式,則yy_recfloat ntohlunsigned long ntohl ; 當傳遞給ntohl時,可能具有不正確字節序的浮點值將轉換為整數表示形式。

由於從floatunsigned long的轉換,您應該收到編譯器警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM