代码之家  ›  专栏  ›  技术社区  ›  Harvey

C++中编译时整数变量的最小值和马克斯值

  •  3
  • Harvey  · 技术社区  · 16 年前

    是否有一种简单、干净的方法可以在编译时确定某个整数变量或类型的变量的最大值和最小值?使用模板?

    例如:

    // Somewhere in a large project is:
    typedef unsigned long XType;
    typedef char YType;
    // ...
    
    // Somewhere else
       XType a;
       YType b;
       LONGLONG c,d,e,f;
       c = MinOfType(a); // Same as c = 0;
       d = MaxOfType(a); // Same as d = 0xffffffff;
       e = MinOfType(b); // Same as e = -128;
       f = MaxOfType(b); // Same as f = 127;
    // Also would be nice
       e = MinOfType(YType); // Same as e = -128; // Using the typename directly
    // Or perhaps
       e = MinOfType<YType>(); // Same as e = -128; // Using the typename directly
    
    5 回复  |  直到 13 年前
        1
  •  9
  •   moonshadow    16 年前
        2
  •  14
  •   Naveen    16 年前

    使用std::numeric_limits,它正好满足这类需求。你可以看看这个 example 为了使用。

        3
  •  3
  •   Community Mohan Dere    9 年前

    看到这个问题 maximum value of int -在答案使用“max”的地方也可以使用“min”

        4
  •  0
  •   kalaxy    13 年前

    如果您可以访问C++ 11,则可以使用 decltype std::numeric_limits . 重写示例代码如下所示:

    #include <limits>
    
    typedef unsigned long XType;
    typedef char YType;
    
    XType a;
    YType b;
    LONGLONG c,d,e,f;
    c = std::numeric_limits< decltype(a) >::min(); // Same as c = 0;
    d = std::numeric_limits< decltype(a) >::max(); // Same as d = 0xffffffff;
    e = std::numeric_limits< decltype(b) >::min(); // Same as e = -128;
    f = std::numeric_limits< decltype(b) >::max(); // Same as f = 127;
    e = std::numeric_limits< YType >::min(); // Same as e = -128; // Using the typename directly
    

    decltype 将从表达式中提取类型,在本例中勾选变量类型,并允许您在其他需要类型(如模板)的地方使用它。所有这些都发生在编译时,这样您就可以将它分配给 constexpr .

    constexpr decltype(a) g = std::numeric_limits< decltype(a) >::min();
    

    在这里 g 与相同类型 a ,的值为0,所有值都在编译时确定。

        5
  •  0
  •   seh Alexei    13 年前

    包含标题 <limits> 到达模板类 std::numeric_limits . 变量的数字类型用于查找模板类的专门化,该模板类将通过函数提供最大值。 max() 最小值通过 min() ,以及该类型的其他几个方面。

    注意解释 最低限度 对于整型和浮点型是不同的。对于前者,它是有符号类型的最大负值,对于无符号类型为零,但对于后者,它是最小的可表示值,非常接近于零。