【问题标题】:C++ variable types limitsC++ 变量类型限制
【发布时间】:2010-12-30 07:52:42
【问题描述】:

这是一个非常简单的问题(我认为),是否有提供变量类型限制的 STL 库方法 (例如整数) ? 我知道这些限制在不同的计算机上有所不同,但必须有办法通过某种方法来解决它们,对吧?

另外,写一个计算变量类型极限的方法真的很难吗?

我只是好奇! :)

谢谢 ;)。

【问题讨论】:

    标签: c++ variables types limits


    【解决方案1】:

    使用std::numeric_limits:

    // numeric_limits example
    // from the page I linked
    #include <iostream>
    #include <limits>
    using namespace std;
    
    int main () {
      cout << boolalpha;
      cout << "Minimum value for int: " << numeric_limits<int>::min() << endl;
      cout << "Maximum value for int: " << numeric_limits<int>::max() << endl;
      cout << "int is signed: " << numeric_limits<int>::is_signed << endl;
      cout << "Non-sign bits in int: " << numeric_limits<int>::digits << endl;
      cout << "int has infinity: " << numeric_limits<int>::has_infinity << endl;
      return 0;
    }
    

    【讨论】:

      【解决方案2】:

      (与C有关,但我认为这也适用于C++)

      您也可以尝试“enquire”,这是一个可以为您的编译器重新创建 limits.h 的脚本。来自 projetc 主页的引述:

      这是一个决定许多 C编译器的属性和 运行它的机器,例如 最小和最大 [un]signed char/int/long,许多属性 float/ [long] double,以此类推。

      作为一个选项,它生成 ANSI C float.h 和 limits.h 文件。

      作为进一步的选择,它甚至会检查 编译器读取头文件 文件正确。

      这是一个很好的编译器测试用例, 因为它锻炼了他们很多 限制值,例如最小值 和最大浮点数。

      【讨论】:

        【解决方案3】:

        我看到已经给出了“正确”的答案:使用&lt;limits&gt; 并让奇迹发生。我碰巧发现这个答案不令人满意,因为问题是:

        写一个计算变量类型极限的方法真的很难吗?

        答案是:整数类型容易,浮点类型难。执行此操作需要 3 种基本类型的算法。有符号、无符号和浮点。每个都有不同的算法来获取最小值和最大值,实际代码涉及一些位旋转,在浮点的情况下,除非你有一个与浮点大小相同的已知整数类型,否则你必须循环输入。

        所以,就是这样。

        无符号很容易。最小值为所有位为 0,最大值为所有位为 1。

        const unsigned type unsigned_type_min = (unsigned type)0;    
        const unsigned type unsigned_type_max = ~(unsigned type)0;
        

        对于有符号,最小值是设置了符号位但所有其他位都为零时,最大值是设置了除符号位之外的所有位。在不知道类型大小的情况下,我们不知道符号位在哪里,但我们可以使用一些位技巧来使其工作。

        const signed type signed_type_max = (signed type)(unsigned_type_max >> 1);
        const signed type signed_type_min = (signed type)(~(signed_type_max));
        

        对于浮点数,有 4 个限制,虽然只知道正限制就足够了,但负限制只是符号反转的正限制。表示浮点数的方法可能有很多,但对于那些使用二进制(而不是基数 10)浮点数的方法,几乎​​每个人都使用 IEEE 表示。

        对于 IEEE 浮点数,最小正浮点值是当指数的低位为 1 且所有其他位为 0 时。最大的负浮点值是它的按位倒数。但是,如果没有已知与给定浮点类型大小相同的整数类型,除了执行循环之外,没有其他方法可以执行此位操作。如果你有一个整数类型并且你知道它的大小与你的浮点类型相同,你可以将其作为一个单一的操作来完成。

        const float_type get_float_type_smallest() {
           const float_type float_1 = (float_type)1.0;
           const float_type float_2 = (float_type)0.5;
           union {
              byte ab[sizeof(float_type)];
              float_type fl;
              } u;
           for (int ii = 0; ii < 0; ++ii)
              u.ab[ii] = ((byte*)&float_1)[ii] ^ ((byte*)&float_2)[ii];
           return u.fl;
           }
        
        const float_type get_float_type_largest() {
           union {
              byte ab[sizeof(float_type)];
              float_type fl;
              } u;
           u.fl = get_float_type_smallest();
           for (int ii = 0; ii < 0; ++ii)
              u.ab[ii] = ~u.ab[ii];
           return -u.fl; // Need to re-invert the sign bit.
           }
        

        【讨论】:

        • 我认为你的回答是最有信息量的,所以这里是一个赞成票和我的问候!
        • 您假设二进制对整数的恭维,这不一定是正确的。获取最大无符号值的唯一可移植方法是= -1,或一些限制常量。
        • @GMan:理论上不做补码运算的系统是可行的,但它们是历史上的好奇心,而不是真正的可移植性问题。
        • C 和 C++ 保证无符号整数的溢出行为,但不保证有符号整数的溢出行为。见Why is unsigned integer overflow defined behavior but signed integer overflow isn't?
        【解决方案4】:
        #include <limits>
        
        std::numeric_limits<type>::max() // min() etc
        

        【讨论】:

          猜你喜欢
          • 2010-11-23
          • 1970-01-01
          • 1970-01-01
          • 2014-04-20
          • 2013-08-31
          • 1970-01-01
          • 1970-01-01
          • 2011-10-16
          • 1970-01-01
          相关资源
          最近更新 更多