【问题标题】:C++11, integer-type determined by range?C ++ 11,整数类型由范围确定?
【发布时间】:2013-08-02 23:35:48
【问题描述】:

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

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

上面的代码在假设'sizeof(unsigned int) >= 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 构建自己的库

【问题讨论】:

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


    【解决方案1】:

    自己实现这个真的很容易。很容易我会说它是用语言实现的:

    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

    【讨论】:

    • 如果下限为负(或两者都为负),您将如何处理?
    • 那么你对RangeBasedInt 的实现会变得更加复杂。 :-) 然而,它只会变得像你想要的那样复杂。如果你有一个表示为负数的限制,你仍然可以decltype 那个文字(假设它是一个文字)并获得一个有符号整数类型来表示它。如果您想制作一个真正通用的RangeBasedInt&lt;Min, Max&gt;,您可以这样做。它在标准库中不存在。而且 decltype 会有很大帮助。
    • 我不相信 2.14.2,说明你在说什么,如果我错了,请用参考来纠正我。 GCC 和 Clang 似乎都为限制 (0x0, 0xFF) 生成 int,其中 unsigned char 将是最小的类型。 (可能是编译器不完善)
    • 2.14.2 声明; “整数文字的类型是表 6 中可以表示其值的相应列表中的第一个。” - 没有任何后缀的序列是; “int,long int,long long int”。
    • @Skeen:没有负整数文字。 -42 是由文字 42 和一元减号 operator- 组成的表达式。字面量在第 2 节中定义,但一元减号运算符在第 5 节中定义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多