2012-05-17 23 views
5

sizeof(unsigned long)がシステムで8になっても、大きな正の整数(8バイト)を使用できるようにしたいほとんどのシステムではunsigned longが4バイトしかなく、少なくとも8バイトであることが保証されているので、unsigned long longをlong longにすることにしました。unsigned long longと符号なしlong(移植性の観点)

私はそれをもっと使うほど、(コンパイラに依存して)いくつかのシステムではprintfも%lluでフォーマットし、%lldでフォーマットするものもあります。

私のコードは、64ビットのdebianマシンでのみ動作し、unsigned longは8バイトになります。移植性は大きな問題ではありません。このような状況では、符号なしlong longをunsigned long longより長く使用するのは残念ですが、unsigned long longをunsigned longより長く使用する利点はありますか?

+7

あなたは 'uint64_t'を試しましたか?それは ' 'にあります。 – Mysticial

+0

符号なしlong longより長く使うことの利点は何ですか? –

+1

厳密に64ビットの型を持たず、長い型の長い型の場合は、コンパイルを停止します。両方ともC++ 11に存在していますが、どちらも以前は拡張子として存在していましたが、時には存在していてもいなくても驚くことはありません。もしあなたがそれを持っていなければ、stdint.hはlong型よりもエミュレートする方が簡単です(型が存在すると仮定します)。 – AProgrammer

答えて

9

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

フォーマットに関しては、printfで、"%llu"を使用する必要があります(符号なしのため)。 "%lld"signed long longです。

+0

Jamesさん、ありがとう、私もそう思っています。unsigned long longを使うのは間違いなく安全です。私の開発環境とターゲット環境では、unsigned longが8バイトであるため、代わりにunsigned longを使用するだけでいいのですか?私がunsigned long longで%lluを使用すると、コンパイラは警告をスローしますが、これらの非移植性は、unsigned long longを使用して私を怖がらせてしまいます。 –

+0

"少なくとも64ビット"はC++ 11以降でしか使用できないのですか? – juanchopanza

+0

@erinc 'long long'と' long'の両方が同じサイズのプラットフォームで作業している場合、生成されたコードは同じものでなければならないので、long longを使用しない理由はありません。また、コンパイラが 'unsigned long long'を' '%llu" 'に渡すときに警告すると、これはバグとしか見なされません。 ''%llu ''に渡す唯一の正当な型は '' unsigned long long'です。他の型を渡すことは未定義の動作です。 –

0

プラットフォームとは独立した固定値の整数値があることを確認する必要がある場合は、boost :: integersライブラリ(hereを参照)を使用できます。符号なしの値にboost :: int64_tまたはboost :: uint64_tを使用できます。

+0

なぜboostを使用し、stdint.hではなくuint64_tを使用するのですか? – WeaselFox

0

あなたが長いと長い長いと滞在したい場合は、この操作を行うことができます。

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

W.r.t.をこの

(コンパイラに依存する)いくつかのシステムではprintfの書式は%のLLUと、一部では、それは形式を推測しません%のLLD

printf()でそれをフォーマットします。あなたはそのフォーマットを教えます。

あなたは上記のように定義uint64をprintfのしたい場合は、このようにそれを実行します。

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

することができますtypedef unsigned long long ulonglong;型にキャストを容易にします。

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

関連する問題