长双对双

我知道各种数据类型的大小可以根据我所在的系统而变化。

我使用 XP 32位,在 C + + 中使用 sizeof()操作符,看起来 long double是12字节,而 double是8。

但是,大多数主要来源指出 long double为8字节,因此范围与 double相同。

为什么我有12个字节?如果 long double确实是12字节,这是否也扩展了值的范围?或者只有当值超过 double 的范围,从而超过8字节时才使用长签名(编译器显示) ?

77144 次浏览

引自 维基百科:

在 x86体系结构中,大多数编译器实现的长双精度类型为该硬件支持的80位扩展精度类型(有时存储为12或16字节以维护数据结构)。

还有

编译器也可以使用长双精度为128位四精度格式,这是目前在软件中实现。

换句话说,是的,long double 能够比 double存储更大范围的值。但这完全取决于编译器。

数字的标准字节大小是跨所有平台保证的最小大小。在某些系统上它们可能更大,但它们永远不会更小。

对于 x64上的现代编译器,Clang 和 GCC 对 long double使用16字节 double,而 VC + + 使用8字节 double。换句话说,使用 Clang 和 GCC 可以获得更高的精度双精度,但是对于 VC + + long doubledouble相同。现代的 x86 CPU 确实支持这些16字节的双精度处理器,因此我认为 Clang 和 GCC 的做法是正确的,它们允许您使用更高级别的语言原语访问较低级别的硬件能力。