C 如何确保不同平台上的浮点大小相同?

C 如何确保不同平台上的浮点大小相同?,c,floating-point,size,portability,platform-independent,C,Floating Point,Size,Portability,Platform Independent,我正在编写必须在不同平台上工作的软件。它使用浮点数。在所有平台上,浮点数在内存中的大小必须相同 对于整数,我可以使用int32\t作为例子。如何对浮点数执行此操作?在C语言中无法移植;你必须接受系统提供的东西 也就是说,在我所知道的所有系统上,sizeoffloat==4和sizeofdouble==8,但依赖于这一点绝对是危险的 不同的机器可以以不同的方式存储相同的值。它们可能使用不同的浮点格式,也可能全部使用IEEE 754。即使它们都使用IEEE 754,也可能以大端或小端顺序存储它们 你

我正在编写必须在不同平台上工作的软件。它使用浮点数。在所有平台上,浮点数在内存中的大小必须相同


对于整数,我可以使用int32\t作为例子。如何对浮点数执行此操作?

在C语言中无法移植;你必须接受系统提供的东西

也就是说,在我所知道的所有系统上,sizeoffloat==4和sizeofdouble==8,但依赖于这一点绝对是危险的

不同的机器可以以不同的方式存储相同的值。它们可能使用不同的浮点格式,也可能全部使用IEEE 754。即使它们都使用IEEE 754,也可能以大端或小端顺序存储它们


你必须决定为什么你认为它们都是一样大小的。很有可能,您试图在不同的机器之间传递信息时走一些不必要的捷径。不要走捷径;他们会在某个时候给你带来麻烦。如果您觉得必须这样做,您必须评估您的可移植性目标到底是什么,并验证您所提议的设计是否能够满足这些目标。但是要非常小心

在C语言中,您无法移植它;你必须接受系统提供的东西

也就是说,在我所知道的所有系统上,sizeoffloat==4和sizeofdouble==8,但依赖于这一点绝对是危险的

不同的机器可以以不同的方式存储相同的值。它们可能使用不同的浮点格式,也可能全部使用IEEE 754。即使它们都使用IEEE 754,也可能以大端或小端顺序存储它们


你必须决定为什么你认为它们都是一样大小的。很有可能,您试图在不同的机器之间传递信息时走一些不必要的捷径。不要走捷径;他们会在某个时候给你带来麻烦。如果您觉得必须这样做,您必须评估您的可移植性目标到底是什么,并验证您所提议的设计是否能够满足这些目标。但是要非常小心

如果需要强制将值设置为相同的大小,则可以设计仅使用已知大小的整数的表示形式。您可以将浮动转换为该格式以保存它们,并在读取它们时将其转换回浮动

请参阅编程人员对frexp函数的解释,该函数将浮点分解为整数指数和双尾数。答案后面的注释将解释如何将尾数转换为整数


您可以保存具有固定长度的整数尾数和指数。然后,您可以读回它们,并使用ldexp函数重新创建原始浮点,当然会出现一些小错误。

如果需要强制将值设置为相同的大小,您可以设计一种仅使用已知大小的整数的表示法。您可以将浮动转换为该格式以保存它们,并在读取它们时将其转换回浮动

请参阅编程人员对frexp函数的解释,该函数将浮点分解为整数指数和双尾数。答案后面的注释将解释如何将尾数转换为整数


您可以保存具有固定长度的整数尾数和指数。然后,您可以读回它们,并使用ldexp函数重新创建原始浮点,当然会出现一些小错误。

为什么它们必须具有相同的大小?@yiu\H它们存储在磁盘上的一个文件中。将sizeofdouble与constant@WTP:嗯,理论上,它们可能仍然是不同的表示形式。这个文件包含二进制格式的浮动?如果是ASCII,无论您使用什么函数来读取它们,例如atof都应该考虑不同的浮点大小。为什么它们必须是相同的大小?@yiu_H它们存储在磁盘上的一个文件中。将sizeofdouble与constant@WTP:理论上,它们可能仍然是不同的表示形式。这个文件包含二进制格式的浮动?如果是ASCII,则无论您使用什么函数来读取它们,例如atof都应该考虑不同的浮点大小。请注意,sizeoffloat==4也不意味着32位。是的,但您上一次在字符位不是8的机器上工作是什么时候?通常,如果你必须处理这些机器,你可能已经知道这些问题,并且不需要首先问这个问题。请注意,sizeoffloat==4也不意味着32位。是的,但是你上一次在字符位不是8的机器上工作是什么时候?通常,如果你必须处理这些机器,你可能已经知道这些问题,不需要首先问这个问题。+1,如果你需要存储它们,请确保使用特殊情况下的无穷大和NaN进行存储。+1,如果你需要存储它们,请确保使用特殊情况下的无穷大和NaN进行存储。。