13

プロジェクトで大きな正の整数 (8 バイト) を使用できるようにしたいのですが、私のシステムでは sizeof(unsigned long) が 8 になりますが、ほとんどのシステムで unsigned long は 4 バイトしかないことを読み、unsigned long を指定することにしました少なくとも 8 バイトであることが保証されているためです。

ただし、使用するほど、移植性が非常に高くないことがわかりました。たとえば、一部のシステム(コンパイラによって異なります)では、printfは%lluでフォーマットし、一部のシステムでは%lldでフォーマットします。

私のコードは、unsigned long が 8 バイトになる 64 ビットの Debian マシンでのみ実行されます。携帯性は大きな問題ではありません。これらの状況で unsigned long よりも unsigned long long を使用するのはやり過ぎですか? unsigned long よりも unsigned long long を使用する利点はありますか?

4

3 に答える 3

20

unsigned long longプラットフォームに関係なく、少なくとも 64 ビットであることが保証されています。(72 ビットと 96 ビットを知っているプラ​​ットフォームもありますが、それらはまれであり、明らかにエキゾチックです。) unsigned longは、少なくとも 32 ビットであることが保証されています。32 ビット以上が必要な場合は、 をお勧めしunsigned long longます。

フォーマットに関しては、withprintfを使用する必要があります"%llu"(署名されていないため); "%lld"ですsigned long long

于 2012-05-17T07:38:56.673 に答える
1

長く長く続けたい場合は、これを行うことができます。

#include <limits.h>
#if ULONG_MAX >= 0xFFFFFFFFFFFFFFFFULL
typedef unsigned long uint64;
#else
typedef unsigned long long uint64;
#endif

これを書く

一部のシステムでは (コンパイラによって異なります) printf は %llu でフォーマットし、一部のシステムでは %lld でフォーマットします

printf()形式を推測しません。フォーマットを伝えます。

uint64上記のように定義されたa を printf したい場合は、次のようにします。

printf("%llu", (unsigned long long)some_uint64_value);

typedef unsigned long long ulonglong;キャストを入力しやすくすることができます。

同じことを行う方法は他にもありますが、すべてのコンパイラがそれらをサポートしているわけではありません。ULLこれが、番号に接尾辞を付けた理由です。C89 と C99 の間の一部の互換モードでは、 0xFFFFFFFFFFFFFFFF はunsigned longではなくとして解釈される場合がunsigned long longあり、切り捨てられます。デフォルトでは、最新の gccgnu89は C コード用のモードで実行されますc99

于 2012-05-17T07:49:07.400 に答える
0

プラットフォームに関係なく、整数値のサイズが固定されていることを確認する必要がある場合は、boost::integers ライブラリを使用できます (こちらを参照)。符号なしの値には boost::int64_t または boost::uint64_t を使用できます

于 2012-05-17T07:38:21.377 に答える