所以这个问题出现了,而在做一些简单的编码时,请考虑以下几点;
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;
};
所以问题是,简单就是这样;
答案 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。