长双和双

Cpp*_*ner 61 c++ floating-point long-double

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

但是,大多数主要消息来源都表示long double是8个字节,因此范围与double相同.

为什么我有12个字节?如果long double确实是12个字节,那么这也不会扩展值的范围吗?或者,当值超出double的范围时,仅使用长签名(编译器数字),因此,超出8个字节?

谢谢.

Bor*_*lid 60

引自维基百科:

在x86架构上,大多数编译器将long double实现为该硬件支持的80位扩展精度类型(有时存储为12或16字节以维护数据结构.

编译器也可以使用long double作为128位四倍精度格式,目前在软件中实现.

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

  • 数据类型在很大程度上取决于您正在开发的体系结构. (2认同)
  • @AaronFranke 这是**填充后的尺寸**。真正的底层类型仍然是 80 位扩展,但出于对齐原因在 x86 上填充为 12 字节,在 x86-64 上填充为 16 字节。除了 MSVC 之外,几乎所有 x86 编译器都这样做。没有人使用 IEEE-754 四倍精度来表示 long double,因为这非常慢 (2认同)

sco*_*777 5

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


Shi*_*hah 5

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

  • 大小为 16 字节,但其中 6 字节是填充。默认情况下,“long double”始终扩展为 80 位,在 x86 和 x86-64 上分别填充为 12/16 字节。如果您愿意打破,您可以通过 [`-mlong-double-64/80/128` 选项](https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html) 更改大小ABI 或一些 API。还有`-m96/128bit-long-double`来改变填充大小 (4认同)