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

Pra*_*nde 23 c c++

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

我使用的long double数据类型,当我这样做sprintf(),并使用long double%lf 在它然后正常工作与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");    
}
Run Code Online (Sandbox Code Playgroud)

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

我尝试在sprintf中进行类型转换,它运行良好.

sprintf(buf, "%.3lf %s", (double) sizeLongDouble, "str");
Run Code Online (Sandbox Code Playgroud)

什么是格式说明符long double

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

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

Som*_*ude 21

因为long double你应该使用格式"%Lf".使用小L(即"%lf")格式化对POSIX系统没有影响(参见规范).

  • 可能值得指出的是,`%lf`与`%f`确实对扫描产生了影响,它仅适用于相同的打印. (2认同)