【问题标题】:Is a float 4 bytes on all windows platforms在所有 Windows 平台上都是 4 个字节的浮点数
【发布时间】:2013-10-19 13:18:01
【问题描述】:

我正在用 C++ 编写一个程序,它将不同的数据存储在一个二进制文件中。我遇到了问题,因为数据类型的大小可以从一个系统更改为另一个系统。我想知道在所有 Windows 平台上浮点数是否总是 4 字节。我构建这个程序的唯一平台是 windows。

【问题讨论】:

    标签: c++ floating-point


    【解决方案1】:

    不受 C++ 标准的保证,但当今大多数机器都遵循 ISO/IEC/IEEE 60559:2011 或相同的 IEEE-754 floating point 标准。按照这个标准,float 的单精度是 4 个字节。

    您可以在<limits> 中检查std::numeric_limits< float >::is_iec559 以确保。

    【讨论】:

      【解决方案2】:

      是的。当然,在其中抛出一个static_assert(sizeof(float)==4, "whatever") 可能是明智的(或者一个普通的旧非静态断言,如果你的编译器不支持前者),只是为了(a)记录你的假设,并且(b)通知您如果由于某种残酷的命运转折,您的平台突然没有 4 字节浮点数。

      【讨论】:

      • 数据类型格式不是由操作系统决定的;它们由编译器决定。
      • 我敢肯定,每个开发人员迟早会遇到#define float double /* more precision */
      • @peppe 也许,但这将是未定义的行为。 :)
      • @CareyGregory:是的,但编译器(通常)不会凭空做出这个决定。理智的编译器通常会尝试与操作系统的 ABI 和 CPU 的指令集保持兼容。当然可能创建一个编译器,其中 float 具有不同的大小,但在使用 32 位 IEEE 浮点操作数的 CPU 上,只要你不工作一个明确定义荒谬怪异和做作的 ABI 的操作系统,这是一个非常安全的假设,即您的编译器也将使用 4 字节 floats
      • @jalf - 用double 代替float 不是未定义的行为。这只是一种非常糟糕的编程习惯,我们迟早都会偶然发现。
      【解决方案3】:

      Windows 没有定义float 的大小——你的编译器定义了它。

      Windows 在windef.h 中定义了一个名为FLOAT 的类型。它被定义为typedef float FLOAT;。这是 Win32 API 使用的类型名称,如果 Windows 支持对您很重要,您应该使用该名称。我怀疑任何 Windows 编译器都会更改其 float 类型的格式,但微软当然可以将其 typedef 更改为 FLOAT,这将改变在所有版本的 Windows 上支持 float 的含义。

      【讨论】:

        【解决方案4】:

        是的,它只有 4 个字节,但不能保证。您可以查看IEEE floating point 以供参考。

        您可以通过这样的跨平台行为进行检查:-

        #include <cassert>
        int main () {
            assert(sizeof(float) == 4);
            // If control goes here you can be sure float is 4 bytes.
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-10
          • 1970-01-01
          • 2013-01-21
          • 1970-01-01
          • 2014-08-13
          • 1970-01-01
          • 2017-03-25
          相关资源
          最近更新 更多