我希望能够在我的项目中使用大的正整数(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还有其他好处吗?
答案 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
或更高。