25

私はUnixとWindowsの32ビットと64ビットのOSのさまざまなフレーバーで動作するアプリケーションに取り組んでいます。

私はlong doubleデータ型を使用しています。データ型を使用しsprintf()て使用すると 、Windowsで正常に動作しますが、エラーは発生しませんが、Solarisプラットフォームではコアダンプが発生します。long double%lf

同じ問題のサンプルコードは次のとおりです。

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()でもう一度型キャストする必要があるのはなぜですか?

4

4 に答える 4

1

これをコメントとして追加しますが、まだできません。また、次のように指数 'p' 表記を使用できることに注意することも重要ですlong double

  • 固定小数点表記:%Lf
  • 指数表記:%Le
  • p表記:%La
于 2015-08-15T21:22:30.483 に答える