fwrite在一台计算机上浮动,在另一台计算机中浮动

fwrite floats on one computer to be fread on another

本文关键字:计算机 一台 fwrite      更新时间:2023-10-16

我有一个程序,它使用以下内容将浮点值写入文件,最终将在用户的计算机上读取。

// computer A
float buffer[1024];
...
fwrite(reinterpret_cast<void*>(buffer), sizeof(float), 1024, file);
// computer B
float buffer[1024];
fread(reinterpret_cast<void*>(buffer), sizeof(float), 1024, file);

这两台计算机上的程序不一样,但它们是用相同的编译器和设置编译的(我不认为会有其他结果)。如果两个程序都是针对平台编译的,那么在所有典型的台式计算机上,浮点值会被解释为预期的吗?或者第二台计算机可能会以不同的方式解释字节吗?

这两台电脑上的程序不一样,但它们是使用相同的编译器和设置编译(我没想到会这样否则进行计算)。浮动是否会被解释为预期在所有典型的台式电脑中,或者可能是第二台计算机会以不同的方式解释字节吗?

几乎所有的现代台式计算机都使用IEEE 754浮点格式作为单精度浮点数,所以你应该没事。

一个潜在的美中不足之处是端序性:如果你在一台具有大端序CPU的计算机上写出文件,然后在一台带有小端序CPU(反之亦然)的计算机上读取,那么读取的计算机将无法正确解释文件的值。在过去几年里,这不是一个大问题,因为现在几乎所有常用的CPU都是小端序,但以前这个问题很常见,例如,当数据从基于英特尔的计算机传输到基于PowerPC的计算机时,或者反之亦然。处理这个问题的一种常见方法是为文件中的值指定一个标准/规范的端序(无论是哪一个),如果保存/加载文件的计算机与文件格式指定的规范端序不匹配,请确保在保存(或加载)文件时对值进行字节交换。

这可能是一个重复的问题。。。

肯定有可能对格式进行不同的解释。

然而,你说的是"典型的台式电脑",通常意味着x86、x64,也许是ARM。但所有这些都使用小端二进制格式。所以在实践中你可能还可以。

一切都取决于编译器。但为了避免出现问题,您可以检查平台的float的一些功能。例如,检查std::numeric_limits<float>::digits,如果为24,则表示编译器对float使用IEEE标准双精度。