2016-10-07 77 views
1

我使用size_t用于我的代码无符号整数。它有一个优点,如果我的电脑支持64位,size_t将是unsigned long long int,否则,它是unsigned int。我的代码可以在32位和64位平台上运行。C++整数类型自动的64位

是否有类似符号的整数?如果平台仅支持32位,则为int,如果平台支持64位,则为long long int

我可以通过设置一个标志实现这一目标:

#ifdef USE_INT64 
    #define MY_INT int 
#else 
    #define MY_INT long long int 
#endif 

然后使用MY_INT。不过,我需要定义USE_INT64并为我的所有代码包含此标头。如果有类似于size_t的东西,它会很棒。

+2

也许使用'uint64_t'? –

+0

cstdint中有一大堆整数类型(http://en.cppreference.com/w/cpp/header/cstdint)。选择一个合适的。 –

+1

从C++ 11开始,所有符合C++编译器都支持64位整数。鉴于此,想要在某些系统上使用32位整数和在其他系统上使用64位整数可能是合理的 - 但首先您应该定义如何做出该选择。另请参阅''标准头文件,它定义了具有精确宽度的整数类型,以及具有*至少*指定宽度的“快速”和“最少”类型。 'int_fast32_t'可能是你想要的。 –

回答

4

如果您想直接将您的类型绑定到地址宽度,那么您寻找的类型称为uintptr_tintptr_t。它们通过<cstdint>从C标准库继承而来。

类型size_t不保证具有与指针相同的大小(一般情况下它较小),这意味着它的可用性是平台特定的。 (阅读:即使它会工作无处不在,它在概念上是错误的)

当然,这里真正的问题是,是否有一个很好的根本原因,以配合您的整型解决宽度。如果不是这样,一个更好的想法是直接通过uintNN_t/intNN_t类型定义来定义你的类型,而忘记了size_t和这样。

+0

谢谢@AnT。 –

0

你可以使用std::make_signed得到确切的符号模拟什么std::size_t是无符号:

using fancy_signed = std::make_signed<std::size_t>::type; 
1

有一个相应的符号类型ptrdiff_t是采取两个指针之间的差来定义。它应该和指针一样大小,就像size_t一样。

+0

“与指针大小相同”是“uintptr_t”。一个实现可以决定使'ptrdiff_t' * *大于指针,以允许用户减去任何指针。 'size_t'通常比指针小*。 – AnT

+0

@AnT我不认为我见过'size_t'或'ptrdiff_t'的大小与指针不同的实现,但我完全忘记了'intptr_t'。 +1你自己的答案。 –