繁体   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