繁体   English   中英

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

[英]unsigned long long vs unsigned long(portability point of view)

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

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

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

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

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

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

如果你想长期和长期逗留,你可以这样做:

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

这个

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

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

如果你想printf一个uint64定义的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或更高版本。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM