Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不同平台上的浮动和双浮动_C++_Floating Point_Double - Fatal编程技术网

C++ 不同平台上的浮动和双浮动

C++ 不同平台上的浮动和双浮动,c++,floating-point,double,C++,Floating Point,Double,所有主要开发系统(windows、Linux和Mac)上的浮点或双精度浮点的格式和大小是否相同 有没有办法确保它们彼此兼容?例如,我可以通过使用int32作为类型而不是int来确保int是32位的,但是对于float和double有类似的技术吗?没有: 1) 格式:取决于体系结构的终结性 2) 大小:double必须不小于float。其他任何事情都是允许的 参见C标准: §6.2.5.10 有三种真正的浮动类型,分别为浮动型、双浮动型和双浮动型 长双人。float类型的值集是 类型为double

所有主要开发系统(windows、Linux和Mac)上的浮点或双精度浮点的格式和大小是否相同

有没有办法确保它们彼此兼容?例如,我可以通过使用int32作为类型而不是int来确保int是32位的,但是对于float和double有类似的技术吗?

没有:

1) 格式:取决于体系结构的终结性

2) 大小:
double
必须不小于
float
。其他任何事情都是允许的

参见C标准:

§6.2.5.10

有三种真正的浮动类型,分别为浮动型、双浮动型和双浮动型 长双人。float类型的值集是 类型为double的一组值;double类型的值集 是long double类型的值集的子集


另请参见

这取决于您所说的“主要开发系统”是什么意思。 Windows和大多数Unix系统使用IEEE float和double,因此 将使用相同的格式。大多数大型机(包括IBM)使用 其他格式

真正的问题是为什么需要兼容性。如果你是 由于担心可移植性,您不使用
int32\t
,因为 仍然有一些平台不支持它。更多 一般来说,除了特殊情况外,您应该使用
int
,并根据涉及
INT_MAX
INT_MIN
以确保不会发生溢出

还存在涉及最小范围和精度的限制。而endianness不影响格式;只有当你试图以字节数组的形式访问变量时,它才起作用(实际上没有任何理由这么做)。@James Kanze:这是一个很好的解释,但我认为格式是指字节排列。也许OP意味着尾数/指数的排列,就像我想的那样。实际上很可能OP意味着字节排列。在这种情况下,应该指出的是,这并不是格式的一部分,因为我现在知道的所有机器都将
float
double
作为“字”,而不是作为字节序列访问。问题表明
int32_t
是整数的解决方案,因此,endianness可能已经被理解或不相关。Windows、Unix或任何其他操作系统都不能确定数据类型的存储方式。这些是编译器(用于确定宽度)和CPU(用于确定布局)的方面,有时是CPU和编译器(用于支持多布局的架构)。@mah:您可以从一个纯粹的角度来看,这是实现的一个功能,因此取决于编译器(可能由CPU通知)。或者,您可以采取一种实用的观点,即托管的C++实现会将系统API暴露给程序员,因此将使用OS的ABI或接近它。至于
extern“C”
链接,无论如何,这包括基本类型的布局。“实用”视图对程序员更有用,例如,如果您在一个体系结构上模拟另一个体系结构,则“纯”视图适用。Windows仅在与英特尔兼容的系统上运行,因此它使用英特尔表示。Unix更为通用,但该标准确实对体系结构做出了一些限制(最重要的是,所有指针都具有相同的大小和表示形式),但事实上,可能存在变体,这就是为什么我说“大多数Unix系统”。(某些版本的Unix确实运行在IBM大型机上,并且不使用IEEE。但是,我怀疑大多数IBM大型机运行的是IBM操作系统,而不是Unix。)@JamesKanze Windows可以与Intel紧密配对,但标识符的选择仍然不正确。例如,MacOS可以与68k紧密结合,我是说PowerPC,我是说Intel(我们可以忽略它是运行在ARM上的非常类似的iOS姐妹)。有理由驳斥该示例,因此,请考虑您关于指针大小、x86与x8664以及突然相同的OS持有不同大小的语句。我同意,您的“最”限定符是正确的,但是我不认为当架构接近时,它会引用OS,并且明确地指出它的需求。@ StestJeSOP似乎是一个给定的C++实现将尊重平台ABI的公共元素。(可以想象不包括
float
double
)。它似乎还将对硬件直接支持的类型使用“本机”表示(不一定包括
float
double
)除此之外,它几乎是任何东西,当然,系统ABI本身也可以参数化:Posix定义了一个ABI,其中基本类型的大小和表示形式只需略微指定(
char
必须是8位,等等)。