【发布时间】:2013-10-19 13:18:01
【问题描述】:
我正在用 C++ 编写一个程序,它将不同的数据存储在一个二进制文件中。我遇到了问题,因为数据类型的大小可以从一个系统更改为另一个系统。我想知道在所有 Windows 平台上浮点数是否总是 4 字节。我构建这个程序的唯一平台是 windows。
【问题讨论】:
标签: c++ floating-point
我正在用 C++ 编写一个程序,它将不同的数据存储在一个二进制文件中。我遇到了问题,因为数据类型的大小可以从一个系统更改为另一个系统。我想知道在所有 Windows 平台上浮点数是否总是 4 字节。我构建这个程序的唯一平台是 windows。
【问题讨论】:
标签: c++ floating-point
不受 C++ 标准的保证,但当今大多数机器都遵循 ISO/IEC/IEEE 60559:2011 或相同的 IEEE-754 floating point 标准。按照这个标准,float 的单精度是 4 个字节。
您可以在<limits> 中检查std::numeric_limits< float >::is_iec559 以确保。
【讨论】:
是的。当然,在其中抛出一个static_assert(sizeof(float)==4, "whatever") 可能是明智的(或者一个普通的旧非静态断言,如果你的编译器不支持前者),只是为了(a)记录你的假设,并且(b)通知您如果由于某种残酷的命运转折,您的平台突然没有 4 字节浮点数。
【讨论】:
#define float double /* more precision */宏
float 具有不同的大小,但在使用 32 位 IEEE 浮点操作数的 CPU 上,只要你不工作一个明确定义荒谬怪异和做作的 ABI 的操作系统,这是一个非常安全的假设,即您的编译器也将使用 4 字节 floats
double 代替float 不是未定义的行为。这只是一种非常糟糕的编程习惯,我们迟早都会偶然发现。
Windows 没有定义float 的大小——你的编译器定义了它。
Windows 在windef.h 中定义了一个名为FLOAT 的类型。它被定义为typedef float FLOAT;。这是 Win32 API 使用的类型名称,如果 Windows 支持对您很重要,您应该使用该名称。我怀疑任何 Windows 编译器都会更改其 float 类型的格式,但微软当然可以将其 typedef 更改为 FLOAT,这将改变在所有版本的 Windows 上支持 float 的含义。
【讨论】:
是的,它只有 4 个字节,但不能保证。您可以查看IEEE floating point 以供参考。
您可以通过这样的跨平台行为进行检查:-
#include <cassert>
int main () {
assert(sizeof(float) == 4);
// If control goes here you can be sure float is 4 bytes.
}
【讨论】: