【发布时间】:2013-12-30 19:32:28
【问题描述】:
所有主要开发系统(Windows、Linux 和 Mac)上的浮点数或双精度数的格式和大小是否相同?
有什么方法可以确保它们相互兼容吗?例如,我可以通过使用 int32_t 作为类型而不是 int 来确保 int 是 32 位的,但是对于 float 和 double 是否有类似的技术?
【问题讨论】:
标签: c++ floating-point double
所有主要开发系统(Windows、Linux 和 Mac)上的浮点数或双精度数的格式和大小是否相同?
有什么方法可以确保它们相互兼容吗?例如,我可以通过使用 int32_t 作为类型而不是 int 来确保 int 是 32 位的,但是对于 float 和 double 是否有类似的技术?
【问题讨论】:
标签: c++ floating-point double
不,没有:
1) 格式:取决于您的架构的字节顺序。
2) 大小:double 必须不小于float。其他任何内容都是允许的。
参见 C 标准:
§6.2.5.10
共有三种真正的浮点类型,分别指定为 float、double 和 长双。 float 类型的值集是 double 类型的值集; double 类型的值的集合 是 long double 类型的值集的子集。
【讨论】:
float和double作为“单词”访问,而不是作为一个字节序列。
int32_t 是整数的解决方案,所以大概字节序已经被理解或不相关。
这取决于您所说的“主要开发系统”是什么意思。 Windows 和大多数 Unix 系统使用 IEEE 浮点数和双精度数,因此它们 将使用相同的格式。大多数大型机(包括 IBM)使用 其他格式。
真正的问题是为什么需要兼容性。如果你是
担心可移植性,您不要使用int32_t,因为
仍然有一些平台不支持它。更多的
通常,在除特殊情况外的所有情况下,您都应该使用
int,并针对涉及的表达式验证输入
INT_MAX 和 INT_MIN 确保不会发生溢出。
【讨论】:
extern "C" 链接而言,这包括基本类型的布局。实用视图对程序员更有用,例如,如果您在另一种架构上模拟一种架构,则纯视图适用。
float 或 double)。似乎它还将对硬件直接支持的类型使用“本机”表示(不一定包括float 或double)。除此之外,几乎所有事情都会发生,当然,系统 ABI 可能会自行参数化:Posix 定义了一个 ABI,其中基本类型的大小和表示只稍微指定(char 必须是 8 位等) .