长双vs双


69

我知道各种数据类型的大小可以根据我所使用的系统而变化。我使用XP 32位,并在C ++中使用sizeof()运算符,似乎long double是12个字节,而double是8。

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

我怎么会有12个字节?如果long double的确是12个字节,这是否还会扩展值的范围?还是仅当值超过double的范围,并因此扩展到超过8个字节时才使用long签名(编译器数字)?

谢谢。


2
这是ISO C中最糟糕的功能。我强烈建议您不要使用它。因为规格太松,所以只会导致问题。
杰夫·哈蒙德

Answers:


71

引用维基百科

在x86架构上,大多数编译器将长整数倍加为该硬件支持的80位扩展精度类型(有时存储为12或16字节以维护数据结构)。

编译器还可以将long double用于128位四倍精度格式,该格式当前在软件中实现。

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


2
数据类型在很大程度上取决于您要开发的体系结构。
karlphillip 2010年

它还取决于编译器选项。几乎每个x86编译器都可以显式禁用80位类型。
greyfade 2010年

1
@ karlphillip,@ greyfade:是的,我的意思是“取决于编译器”,因为它决定了如何存储数据。显然,它仅限于平台上可用的功能,当然编译器可以选择允许用户覆盖。
Borealid


14

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


3

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.