unsigned long long vs unsigned long(可移植性观点)

时间:2012-05-17 07:31:26

标签: c++ unsigned-long-long-int

我希望能够在我的项目中使用大的正整数(8个字节),即使sizeof(unsigned long)在我的系统中产生8,我读到在大多数系统中unsigned long只有4个字节而且我决定给unsigned long long a go,因为它保证至少为8个字节。

我使用的越多,我看到它也不是超级便携的,例如在某些系统中(取决于编译器)printf格式化它与%llu,在某些系统中它用%lld格式化。

我的代码只能在64位debian机器上运行,其中unsigned long将是8个字节。便携性不是一个大问题。在这些情况下使用无符号long long而非unsigned long是否过度杀伤,使用unsigned long long over unsigned long还有其他好处吗?

3 个答案:

答案 0 :(得分:10)

无论平台如何,

unsigned long long保证至少为64位。 (有些平台更多 - 我知道72位和96位 - 但它们很少见,而且非常奇特。)unsigned long保证至少为32位。如果您需要超过32位,我建议unsigned long long

关于使用printf的格式设置,您应该使用"%llu"(因为它是无符号的); "%lld"适用于signed long long

答案 1 :(得分:0)

如果你需要确保你有一个固定大小的整数值,独立于平台,你可以使用boost :: integers库(参见here)。您可以使用boost :: int64_t或boost :: uint64_t作为无符号值

答案 2 :(得分: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("%llu", (unsigned long long)some_uint64_value);

您可以typedef unsigned long long ulonglong;使演员更容易输入。

确实存在其他方法,但并非所有编译器都支持它们。这就是我将ULL后缀附加到数字的原因。在C89和C99之间的某些兼容模式中,0xFFFFFFFFFFFFFFFF可能被解释为unsigned long,而不是unsigned long long,并且将被截断。默认情况下,最新的gcc在gnu89模式下运行C代码,而不是c99或更高。