13

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

不过,我使用它的次数越多,我发现它也不是超级便携,例如在某些系统中(取决于编译器)printf 使用 %llu 对其进行格式化,在某些系统中使用 %lld 对其进行格式化。

我的代码只能在 64 位 debian 机器上运行,其中 unsigned long 将是 8 个字节。便携性不是一个大问题。在这种情况下,使用 unsigned long long 而不是 unsigned long 是否有点矫枉过正,使用 unsigned long long 而不是 unsigned long 还有其他好处吗?

4

3 回答 3

20

unsigned long long无论平台如何,都保证至少为 64 位。(有些平台更多——我知道 72 位和 96 位——但它们很少见,而且绝对是异国情调。) unsigned long保证至少是 32 位。如果您需要超过 32 位,我会推荐unsigned long long.

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

于 2012-05-17T07:38:56.673 回答
1

如果你想保持 long 和 long long,你可以这样做:

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

写这个

在某些系统中(取决于编译器)printf 使用 %llu 对其进行格式化,在某些系统中使用 %lld 对其进行格式化

printf()不猜格式。你告诉它格式。

如果你想像uint64上面定义的那样 printf a,这样做:

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

您可以typedef unsigned long long ulonglong;使演员更容易打字。

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

于 2012-05-17T07:49:07.400 回答
0

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

于 2012-05-17T07:38:21.377 回答