我知道各种数据类型的大小可以根据我所使用的系统而变化。我使用XP 32位,并在C ++中使用sizeof()运算符,似乎long double是12个字节,而double是8。
但是,大多数主要来源都指出,long double是8个字节,因此范围与double相同。
我怎么会有12个字节?如果long double的确是12个字节,这是否还会扩展值的范围?还是仅当值超过double的范围,并因此扩展到超过8个字节时才使用long签名(编译器数字)?
谢谢。
我知道各种数据类型的大小可以根据我所使用的系统而变化。我使用XP 32位,并在C ++中使用sizeof()运算符,似乎long double是12个字节,而double是8。
但是,大多数主要来源都指出,long double是8个字节,因此范围与double相同。
我怎么会有12个字节?如果long double的确是12个字节,这是否还会扩展值的范围?还是仅当值超过double的范围,并因此扩展到超过8个字节时才使用long签名(编译器数字)?
谢谢。
Answers:
引用维基百科:
在x86架构上,大多数编译器将长整数倍加为该硬件支持的80位扩展精度类型(有时存储为12或16字节以维护数据结构)。
和
编译器还可以将long double用于128位四倍精度格式,该格式当前在软件中实现。
换句话说,是的,along double
可能比a能够存储更大的值范围double
。但这完全取决于编译器。
long double
是128位:developer.apple.com/library/archive/documentation/Darwin/...
对于x64上的现代编译器,Clang和GCC使用16字节的double作为long double
VC ++使用8字节的double。换句话说,使用Clang和GCC可以获得更高的精度,但是VC ++long double
与相同double
。现代的x86 CPU确实支持这些16字节的双精度,因此我认为Clang和GCC做的正确,并允许您使用高级语言基元访问较低级别的硬件功能。
数字的标准字节大小是所有平台上保证的最小大小。在某些系统上,它们可能更大,但永远不会更小。