質問

sprintfを使用してuint_64を文字列に変換するc(++)コードがあります。これは、LinuxとSolarisの両方に移植可能である必要があります。

Linuxでは%juを使用しますが、Solarisには同等のものはないようです。私が見つけることができる最も近いものは%luですが、これは誤った出力を生成します。サンプルコード:

#include <stdio.h>
#include <sys/types.h>

#ifdef SunOS
typedef uint64_t u_int64_t;
#endif

int main(int argc, char **argv) {
    u_int64_t val = 123456789123L;

#ifdef SunOS
    printf("%lu\n", val);
#else
    printf("%ju\n", val);
#endif
}

Linuxでは、出力は期待どおりです。 Solaris 9(尋ねないでください)では、&quot; 28&quot;

です。

使用できるもの

役に立ちましたか?

解決

inttypes.hを使用できる場合は、それが提供するマクロを使用できます。

printf(  "%" PRIu64 "\n", val);

あまりきれいではありませんが(最近はそう言っているようです)、機能します。

他のヒント

C99準拠のシステムの場合:

#include <inttypes.h>

uint64_t big = ...;
printf("%" PRIu64 "\n", big);

C99標準のセクション7.8を参照してください。

指定子は{PRI、SCN} [diouxX] {N、LEASTN、MAX、FASTN、PTR}です

PRIはprintf()ファミリ用、SCNはscanf()ファミリ用、dおよびiは符号付き整数型用です。 o、u、x、Xは、8進数、10進数、16進数、16進数などの符号なし整数型用です。 Nはサポートされている幅の1つです。 LEASTおよびFASTはこれらの修飾子に対応します。 PTRはintptr_t用です。 MAXはintmax_t用です。

答えは、コードが実際にCかC ++かによって異なります。 Cでは、別の型ではなく unsigned long long を使用する必要があります(これは現在の標準に準拠しており、C99サポートに関する限り、 long long はかなり一般的です)、定数に L の代わりに ULL を追加し、(前述したように)指定子として%llu を使用します。 C99のサポートが存在しない場合は、他の標準的な方法がないため、コンパイラのドキュメントを確認することをお勧めします。 long long は少なくとも64ビットであることが保証されています。

長い間%llu を使用できます。ただし、 long long は64ビットであることが保証されていないため、これはあまり移植性がありません。 :-)

SunOSの条件付きtypedefを回避する場合は、 stdint.h から uint64_t を取得できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top