C++跨平台方式来定义64位无符号整数

问题描述:

现在我正在一个项目中广泛使用64位无符号整数在代码的很多部分。到目前为止,我们只用gcc 4.6进行编译,但现在我们正在将一些代码移植到windows。这些未签名的整数是64位宽是至关重要的。有人建议我们可以使用long long,但如果long long长度大于64bits,它并不好,我们实际上想要保证它会是64位,写一些像static_assert(sizeof(long long) == 8)似乎有点代码闻。C++跨平台方式来定义64位无符号整数

什么是最好的方式来定义类似uint64的东西,可以跨gcc和msvc编译而不需要在任何地方都使用不同的代码语法?

+5

为什么不直接使用'uint64_t'? – Fanael 2012-02-14 14:09:17

+0

会ifdef和typedef在一起做的伎俩? – 2012-02-14 14:12:36

+0

@DavidFeurle,这可能就足够了,提出这个问题的目的是为了感受最佳实践在这里。 – shuttle87 2012-02-14 14:16:24

怎么样包括cstdint和使用std::uint64_t

+1

这只是在C++ 11。在此之前,大多数编译器都有内在的工作。 – David 2012-02-14 14:35:00

+0

他已经在使用static_assert。 – kukyakya 2012-02-14 14:47:34

+0

@kukyakya,我现在正在gcc上做这件事,但我不知道MSVC是否存在静态断言,因为我几乎没有经历过这种情况。 – shuttle87 2012-02-14 15:12:46

可以使用升压:

的类型定义INT#_t,其中#代表宽度所取代,表示恰好#比特的带符号整数 类型;例如int8_t表示一个8位的 有符号整数类型。类似地,typedef uint#_t指定一个无符号整数类型的正好#位的 。

参见:http://www.boost.org/doc/libs/1_48_0/libs/integer/doc/html/boost_integer/cstdint.html

特别是今年头: http://www.boost.org/doc/libs/1_48_0/boost/cstdint.hpp

+0

有趣的建议,因为我们使用boost很多,如果'cstdint'不可用,这可能会做这个技巧。 – shuttle87 2012-02-14 17:13:06

在Windows下你可以使用__int64unsigned __int64,或类型定义:UINT64INT64

this

但是,我f代码可移植性值得关注,请使用其他人所建议的标准typedefs。

这是我做的:

#ifndef u64 
#ifdef WIN32 
typedef unsigned __int64 u64; 
#else // !WIN32 
typedef unsigned long long u64; 
#endif 
#endif