C ++ 11,整数类型由范围决定?

时间:2013-08-02 23:35:48

标签: c++11 long-integer numeric-limits

所以这个问题出现了,而在做一些简单的编码时,请考虑以下几点;

for(unsigned int x=0x00000000; x<0xFFFFFFFF; x++)
{
    // ...
}

上面的代码按预期工作,假设'sizeof(unsigned int)&gt; = 4',但是正如我们所知,在某些平台上这可能不是真的,因此我对此类内容感兴趣;

for(RangeBasedInt<0x00000000, 0xFFFFFFFF>::type x=0x00000000; x<0xFFFFFFFF; x++)
{
    // ...
}

其中'RangeInt'是一个模板,'type'是最小的整数类型,足以容纳从MINIMUM(0x00000000)到MAXIMUM(0xFFFFFFFF)的值范围;

template<int MINIMUM, int MAXIMUM>
struct RangeBasedInt
{
    // Type based upon MINIMUM and MAXIMUM
    typedef /* MAGIC */ type;
};

所以问题是,简单就是这样;

  1. 这是在标准库的某处实现的吗?
  2. 如果没有,是否有一个实现这个的库,或者我必须根据std :: numeric_limits构建我自己的库

1 个答案:

答案 0 :(得分:2)

自己实现这一点非常容易。我很容易说它是用语言实现的:

typedef decltype(0xFFFFFFFF) RangeBasedInt;
for(RangeBasedInt x=0x00000000; x<0xFFFFFFFF; x++)
{
    // ...
}

2.14.2 [lex.icon]声明积分文字的类型是可以容纳该值的最小类型。因此,如果int可以在您的计算机上保留0xFFFFFFFF,则RangeBasedInt可以是int。在我的机器上,它是unsigned int

对于此特定限制(0xFFFFFFFF),标准保证它可以由其中一个内置整数类型表示。 ULONG_MAX必须不小于4294967295(0xFFFFFFFF),ULLONG_MAX必须不小于18446744073709551615(0xFFFFFFFFFFFFFFFF)。

<强>更新

我在Skeen的技术性方面做了更正。 [lex.icon]中的表6实际上并不是说“最小类型”。它实际上说如果文字是八进制或十六进制常量,它将是以下列表中可以表示其值的第一个类型:

int
unsigned int
long int
unsigned long int
long long int
unsigned long long int

表继续指定不同的列表,具体取决于文字是否为小数,以及是否为后缀。当我说“最小”时,我肯定是在释义。有关详细信息,请参阅实际标准,而不是SO答案(由我或其他任何人)。在我写这篇文章时,C ++ 1y的最新草案是N3691