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

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

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

这两个标准是否有任何关于此事的说法?

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

摘录自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__的实现应符合本附录中的规范.356)C语言与IEC 60559之间的约束是除非另有说明,否则IEC 60559指定的行为仅供参考。 由于负和正无穷大在IEC 60559格式中是可表示的,因此所有实数都在可表示值的范围内。

因此,包括 (或在C ++中可能是 ),并测试__STDC_IEC_559__

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

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

没有说明大小。

3.9.1.8

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

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

最好的办法是仔细使用static_assertsizeoftypedef#define来定义跨平台浮点类型。

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

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

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

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

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

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

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

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