【问题标题】:Floating point Endianness?浮点字节序?
【发布时间】:2011-02-26 01:46:35
【问题描述】:

我正在为实时海上模拟器编写客户端和服务器,并且由于我必须通过套接字发送大量数据,我正在使用二进制数据来最大化我可以发送的数据量。我已经知道整数字节序,以及如何使用htonlntohl 来规避字节序问题,但是我的应用程序,就像几乎所有的模拟软件一样,会处理很多浮点数。

我的问题是:在处理浮点数的二进制格式时是否存在字节顺序问题?我知道我的代码将运行的所有机器都使用浮点的 IEEE 实现,但是在处理浮点数时是否存在一些字节顺序问题?

由于我只能访问具有相同字节序的机器,因此我无法自行测试。所以,如果有人能帮我解决这个问题,我会很高兴。

【问题讨论】:

标签: c++ networking endianness


【解决方案1】:

根据Wikipedia

浮点和字节序

在某些机器上,整数是 以小端形式表示, 浮点数是 以大端形式表示。 因为有很多浮点数 格式,缺乏标准 “网络”表示,无标准 用于传输浮点值 已经完成。这意味着 浮点数据写入一个 机器可能无法读取 另一个,即使是这样 两者都使用 IEEE 754 浮点 算术因为的字节序 内存表示不是 IEEE 规范。

【讨论】:

  • @Craig M. Brandenburg:感谢您为使此答案保持最新状态所做的努力,但是您的编辑大大改变了我的答案的含义,因此我将其回滚。我建议你只发布自己的答案——如果你这样做了,我会投赞成票。
  • 仅供参考,维基百科上的内容已经更新(并且更好):“尽管今天无处不在的 x86 使用 little-endian 存储所有类型的数据(整数、浮点、BCD),但有一些历史机器以大端形式表示浮点数,而以小端形式表示整数。” ...“但是,在现代标准计算机(即实现 IEEE 754)上,实际上可以安全地假设浮点数的字节序与整数的字节序相同,因此无论数据类型如何,转换都很简单。”跨度>
【解决方案2】:

是的,浮点可以依赖字节序。有关信息,请参阅Converting float values from big endian to little endian,请务必阅读 cmets。

【讨论】:

    【解决方案3】:

    编辑:以下是错误的答案(让人们知道这种“有点流行”的观点是错误的,请阅读已接受的答案和关于此答案的 cmets)

    --错误的答案开始--

    没有浮点字节序或整数字节序等。它只是二进制表示字节序。 机器要么是小端,要么是大端。这意味着它将以任何数据类型的二进制表示形式将 MSb/MSB 表示为其第一位/字节或最后一位/字节。 而已。

    --错误的答案结束--

    【讨论】:

    • 感谢您对字节顺序含义的澄清。我不确定在浮点数的情况下如何定义 MSB 顺序。
    • 投反对票的人愿意解释一下吗?虽然这篇文章很好地阐明了字节序的主题,并且符合我自己对它的理解。
    • 虽然我没有投反对票,但可能是因为该声明实际上并不正确。在某些系统中,FPU 期望的字节顺序与系统的其他部分不同,在这种情况下会出现“浮点字节序”和“整数字节序”。不过,我认为这对现代架构来说不是什么大问题,因此作为一般规则,您可能可以忽略这种区别。
    • @Dennis 谢谢。我不知道存在 FPU 使用不同字节序的系统。
    • FPU 的相关性在于存储在内存中的浮点数将使用本机字节顺序,即 FPU 预期和产生的顺序。有些机器使用大端和小端存储浮点数。
    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2011-05-29
    • 2010-09-05
    • 1970-01-01
    相关资源
    最近更新 更多