什么是`long double`的格式说明符

我正在研究适用于各种Unix和Windows 32位和64位操作系统的应用程序。

我正在使用long double数据类型,当我执行sprintf()并在其中使用带有%lf long double ,它可以正常使用windows并不会产生任何类型的错误,但是在Solaris平台上它提供了核心转储。

相同问题的示例代码如下。

 void main(){ string size = "16622"; string sizeFact = "20"; long long sizeLongLong = strtoll(size); int factInt = atoi(sizeFact); long double sizeLongDouble = (long double) sizeLongLong/pow(2, factInt); char buf[512]; sprintf(buf, "%.3lf %s", sizeLongDouble, "str"); } 

如上所述,代码在Windows 32位和64位上运行良好,但对于sprintf,它在Solaris上为我提供了核心。

我尝试在sprintf中进行类型转换,它工作得很好。

 sprintf(buf, "%.3lf %s", (double) sizeLongDouble, "str"); 

long double的格式说明符是什么?

我在这里犯的错是什么,我使用了错误的格式说明符,因为它给了核心?

为什么我需要在sprintf()中再次输入强制转换?

对于long double您应该使用格式"%Lf" 。 使用小L(即"%lf" )格式化对POSIX系统没有影响(请参阅规范 )。

该文档非常清楚:

大号

随后的a,A,e,E,f,F,gG转换对应于长双参数。 (C99>允许%LF,但SUSv2不允许。)

所以,你应该使用%Lf

根据编译器,我看到%Lf%llf尝试两者并查看哪些有效。 您使用的%lfdouble的格式说明符,而不是long double 。 我相信g++你应该使用%llf ,而在visual studio上它是%Lf

我会将此添加为评论,但我还不能这样做。 同样重要的是要注意,你也可以用这种方式使用指数’p’符号表示long double

  • 定点表示法: %Lf
  • 指数表示法: %Le
  • 表示法: %La