9

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 では (聞かないでください)、「28」です。

何を使用できますか?

4

5 に答える 5

11

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

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

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

于 2008-10-03T00:22:30.070 に答える
7

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 用です。

于 2008-10-03T00:33:05.067 に答える
2

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

于 2008-10-03T00:23:29.087 に答える
0

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

于 2008-10-03T00:20:26.410 に答える
0

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

于 2008-10-03T00:22:47.543 に答える