C和C ++中float和double的大小是多少?

时间:2014-08-27 10:09:33

标签: c++ c floating-point x86 64-bit

我一直在寻找是否有类似于uint32_t的标准类型,它总是映射成32位无符号整数类型,但我找不到任何类型。

float的大小在所有平台上总是4个字节吗? double的大小是否始终为8?

这两个标准是否就此事发表任何意见?

我想确保我的大小在所有平台(x86和x64)上总是相同的,所以我使用的是标准的int类型,但我找不到float和{{1}的任何类似的typedef }。

7 个答案:

答案 0 :(得分:14)

摘录自C99标准,规范性附录F(C ++标准没有明确提及本附件,但它包括所有受影响的函数,每个引用没有更改。此外,类型必须匹配兼容性。):

  

IEC 60559浮点运算

     

F.1简介

     

1本附录规定了对IEC 60559浮点标准的C语言支持。该   IEC 60559浮点标准专门用于二进制浮点运算   先前指定的微处理器系统,第二版(IEC 60559:1989)   IEC 559:1989和IEEE二进制浮点运算标准   (ANSI / IEEE 754-1985)。基于与基数无关的浮点的IEEE标准   算术(ANSI / IEEE 854-1987)概括了要删除的二进制标准   对基数和字长的依赖性。 IEC 60559一般是指浮点数   标准,如IEC 60559操作,IEC 60559格式等。一种实现方式   定义__STDC_IEC_559__应符合本附录中的规范.366)   如果指出了C语言和IEC 60559之间的绑定,那么   除非另有说明,否则IEC 60559规定的行为仅供参考。以来   所有实数都可以用IEC 60559格式表示负和无穷大   在可表示的值范围内。

因此,请加<math.h>(或在C ++中<cmath>},并测试__STDC_IEC_559__

如果定义了宏,不仅更好地指定了类型(float为32位,double为64位,而且内置运算符和标准函数的行为也更明确。
缺乏宏观并没有给予任何保证。

对于x86和x86_64(amd64),您可以依赖符合IEC-60559的类型floatdouble,但使用它们的函数和对它们的操作可能不是。

答案 1 :(得分:12)

没有说明大小。

3.9.1.8

  

有三种浮点类型:float,double和long double。   double类型提供至少与float一样多的精度   类型long double提供至少与double一样多的精度。该   float类型的值集是该组值的子集   双重类型; double类型的值集是。的子集   long double类型的值集。价值表示   浮点类型是实现定义的。积分和浮动   类型统称为算术类型。专业化   标准模板std :: numeric_limits(18.3)应指定最大值   和实现的每种算术类型的最小值。

答案 2 :(得分:6)

C ++标准没有说什么,但在大多数平台上,C ++使用IEEE的单/双精度标准,它将单精度定义为4字节,双精度定义为8字节。

http://en.wikipedia.org/wiki/Single-precision_floating-point_format http://en.wikipedia.org/wiki/Double-precision_floating-point_format

我不确定这些案例的例外情况。

答案 3 :(得分:4)

由于CPU的浮点运算由低级别实现,因此C ++标准不要求floatdoublelong double的大小。它所说的是我指定它们的顺序是相等或递增的精度。

您最好的选择是谨慎使用static_assertsizeoftypedef#define,以便定义跨平台浮点类型。

答案 4 :(得分:0)

您可以尝试使用提供跨平台数据类型兼容性的库。

&#34;从C继承的整数类型C ++是跨平台的危险。 int,long和friends在不同的平台上有不同的大小(今天的32位和64位系统,可能是128位之后)。对于某些应用程序,它似乎无关紧要,因为它们从不接近32位限制(或者如果使用无符号整数,则为31位),但如果在64位系统上序列化对象并在32位系统上反序列化,可能会令人不快的惊讶 APR为不同平台上可能不同的基本类型提供了一组typedef。这些typedef提供了保证大小并避免模糊内置类型。但是,对于某些应用程序(主要是数字应用程序),有时候使用本机机器字大小(通常是int代表的)来实现最大性能是很重要的。&#34;

Gigi SAYFAN - 构建自己的插件框架 (来自http://philippe.ameline.free.fr/techytechy/071125_PluginFramework.htm

答案 5 :(得分:0)

我想指出,即使你有相同的大小浮动你也不能确保这些浮动在不同的平台上同等解释。你可以阅读很多关于“网上花车”的论文。浮动非确定性是一个已知问题。

答案 6 :(得分:0)

对于X86,即使使用IEEE单精度和双精度数,内部计算也会受到浮点控制字(FCW)的影响。内部计算通常为64位或80位(长双)。您可以使用内联汇编代码覆盖它,但不能保证某些双精度库函数不会将其设置回来。

微软支持其16位编译器的80位长双打,但是使用32位和64位编译器不再支持它们,而长双精度现在与64位双精度相同。