【问题标题】:What range of values can integer types store in C++整数类型可以在 C++ 中存储的值范围是多少
【发布时间】:2010-12-21 14:37:52
【问题描述】:

unsigned long int 可以在 32 位计算机上保存十位数字 (1,000,000,000 - 9,999,999,999) 吗?

另外,unsigned long intlong intunsigned intshort intshort unsigned intint的范围是多少?

【问题讨论】:

    标签: c++ int


    【解决方案1】:

    您可以依赖的最小范围是:

    • short intint:-32,767 到 32,767
    • unsigned short intunsigned int:0 到 65,535
    • long int:-2,147,483,647 到 2,147,483,647
    • unsigned long int:0 到 4,294,967,295

    这意味着不,long int不能被依赖来存储任何 10 位数字。但是,在 C99 中的 C 和 C++11 中的 C++ 中引入了更大的类型 long long int(这种类型也经常被为不包含它的旧标准构建的编译器作为扩展支持)。如果您的编译器支持,此类型的最小范围是:

    • long long int:-9,223,372,036,854,775,807 到 9,223,372,036,854,775,807
    • unsigned long long int:0 到 18,446,744,073,709,551,615

    所以该类型将足够大(再次,如果你有它可用)。


    对于那些认为我在这些下限上犯了错误的人的说明:编写范围的 C 要求是为了允许一个的补码或符号大小整数表示,其中最低可表示值和最高可表示值仅在符号上不同。还允许使用二进制补码表示,其中符号位为 1 且所有值位为 0 的值是 陷阱表示,而不是合法值。换句话说,int 不需要能够表示值 -32,768。

    【讨论】:

    • 标题原本也写着“C/C++”。
    • 为什么 long long int 正范围 == 负范围
    • @mohamedab​​dallah:请参阅答案的最后一段:C 标准范围是允许一个的补码或符号幅度表示的方式。
    • 啊哈..我意识到int 的意思是long int
    【解决方案2】:

    您可以使用limits 头文件中的numeric_limits<data_type>::min()numeric_limits<data_type>::max() 函数并找出每种数据类型的限制。

    #include <iostream>
    #include <limits>
    using namespace std;
    int main()
    {
        cout<<"Limits of Data types:\n";    
        cout<<"char\t\t\t: "<<static_cast<int>(numeric_limits<char>::min())<<" to "<<static_cast<int>(numeric_limits<char>::max())<<endl;
        cout<<"unsigned char\t\t: "<<static_cast<int>(numeric_limits<unsigned char>::min())<<" to "<<static_cast<int>(numeric_limits<unsigned char>::max())<<endl;
        cout<<"short\t\t\t: "<<numeric_limits<short>::min()<<" to "<<numeric_limits<short>::max()<<endl;
        cout<<"unsigned short\t\t: "<<numeric_limits<unsigned short>::min()<<" to "<<numeric_limits<unsigned short>::max()<<endl;
        cout<<"int\t\t\t: "<<numeric_limits<int>::min()<<" to "<<numeric_limits<int>::max()<<endl;
        cout<<"unsigned int\t\t: "<<numeric_limits<unsigned int>::min()<<" to "<<numeric_limits<unsigned int>::max()<<endl;
        cout<<"long\t\t\t: "<<numeric_limits<long>::min()<<" to "<<numeric_limits<long>::max()<<endl;
        cout<<"unsigned long\t\t: "<<numeric_limits<unsigned long>::min()<<" to "<<numeric_limits<unsigned long>::max()<<endl;
        cout<<"long long\t\t: "<<numeric_limits<long long>::min()<<" to "<<numeric_limits<long long>::max()<<endl;
        cout<<"unsiged long long\t: "<<numeric_limits<unsigned long long>::min()<<" to "<<numeric_limits<unsigned long long>::max()<<endl;
        cout<<"float\t\t\t: "<<numeric_limits<float>::min()<<" to "<<numeric_limits<float>::max()<<endl;
        cout<<"double\t\t\t: "<<numeric_limits<double>::min()<<" to "<<numeric_limits<double>::max()<<endl;
        cout<<"long double\t\t: "<<numeric_limits<long double>::min()<<" to "<<numeric_limits<long double>::max()<<endl;
    }
    

    输出将是: 数据类型的限制:

    • 字符:-128 到 127
    • 无符号字符:0 到 255
    • 短:-32768 到 32767
    • 无符号短:0 到 65535
    • int : -2147483648 到 2147483647
    • 无符号整数:0 到 4294967295
    • 长:-2147483648 到 2147483647
    • 无符号长:0 到 4294967295
    • 长长:-9223372036854775808 至 9223372036854775807
    • unsigned long long : 0 到 18446744073709551615
    • 浮点数:1.17549e-038 到 3.40282e+038
    • 双倍:2.22507e-308 到 1.79769e+308
    • long double : 3.3621e-4932 到 1.18973e+4932

    【讨论】:

      【解决方案3】:

      在 C++ 中,现在 int 和其他数据使用 2 的补码方法存储。 这意味着范围是:

      -2147483648 to 2147483647
      

      或 -2^31 到 2^31-1

      1 位为 0 保留,因此正值小于 2^(31)

      【讨论】:

        【解决方案4】:

        数字类型的大小在 C++ 标准中没有定义,尽管有最小大小。判断它们在您的平台上的大小的方法是使用numeric limits

        例如,可以通过以下方式找到 int 的最大值:

        std::numeric_limits<int>::max();
        

        计算机不能以 10 为底工作,这意味着最大值将采用 2n-1 的形式,因为内存中的数字表示方式。以八位(1字节)为例

          0100 1000
        

        设置为1时最右边的位(数字)代表20,下一个位21,然后是22等等直到我们到达最左边的位,如果数字是无符号的,则表示 27

        所以这个数字代表26 + 23 = 64 + 8 = 72,因为设置了右边的第4位和左边的第7位。

        如果我们将所有值设置为 1:

        11111111
        

        现在的数字是(假设无符号
        128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 = 28 - 1
        正如我们所看到的,这是可以用 8 位表示的最大可能值。

        在我的机器上,int 和 long 是相同的,每个都可以在 -231 到 231 - 1 之间保持。根据我的经验,最常见的大小在现代 32 位台式机上。

        【讨论】:

        • 整数类型的最小尺寸由相关标准规定(尽管没有精确尺寸)。
        【解决方案5】:

        要找出您的系统的限制:

        #include <iostream>
        #include <limits>
        int main(int, char **) {
          std::cout
            << static_cast< int >(std::numeric_limits< char >::max()) << "\n"
            << static_cast< int >(std::numeric_limits< unsigned char >::max()) << "\n"
            << std::numeric_limits< short >::max() << "\n"
            << std::numeric_limits< unsigned short >::max() << "\n"
            << std::numeric_limits< int >::max() << "\n"
            << std::numeric_limits< unsigned int >::max() << "\n"
            << std::numeric_limits< long >::max() << "\n"
            << std::numeric_limits< unsigned long >::max() << "\n"
            << std::numeric_limits< long long >::max() << "\n"
            << std::numeric_limits< unsigned long long >::max() << "\n";
        }
        

        请注意,long long 仅在 C99 和 C++11 中合法。

        【讨论】:

          【解决方案6】:

          对于无符号数据类型,没有符号位,所有位都用于数据 ;而对于有符号数据类型,MSB 表示符号位,其余位用于数据。

          要查找范围,请执行以下操作:

          Step:1 -> 找出给定数据类型的字节数。

          步骤:2 -> 应用以下计算。

                Let n = no of bits in data type  
          
                For signed data type ::
                      Lower Range = -(2^(n-1)) 
                      Upper Range = (2^(n-1)) - 1)  
          
                For unsigned data type ::
                      Lower Range = 0 
                      Upper Range = (2^(n)) - 1 
          

          例如

          对于 unsigned int size = 4 bytes (32 bits) --> Range [0 , (2^(32)) - 1]

          对于有符号整数大小 = 4 字节(32 位)--> 范围 [-(2^(32-1)) , (2^(32-1)) - 1]

          【讨论】:

            【解决方案7】:

            这里的其他人将发布指向数据大小和精度等的链接。
            我将告诉你如何自己弄清楚。
            编写一个小应用程序,它将执行以下操作。

            unsigned int ui;
            std::cout <<  sizeof(ui));
            

            这将(取决于编译器和架构)打印 2、4 或 8,表示 2 字节长、4 字节长等。

            假设它是 4。

            您现在想要 4 个字节可以存储的最大值,一个字节的最大值是(十六进制)0xFF。四个字节的最大值是 0x,后跟 8 个 f(每个字节有一对 f,0x 告诉编译器后面的字符串是一个十六进制数)。现在更改您的程序以分配该值并打印结果

            unsigned int ui = 0xFFFFFFFF;
            std::cout <<  ui;
            

            这是 unsigned int 可以容纳的最大值,以 base 10 表示。

            现在对 long's、shorts 和您感兴趣的任何其他 INTEGER 值执行此操作。

            注意:这种方法不适用于浮点数(即双精度或浮点数)。

            希望对你有帮助

            【讨论】:

            • 如果你用有符号整数尝试这个,你会得到负数。阅读“两个恭维”(提供链接),也很容易获得这些的全部范围(正面和负面)。 en.wikipedia.org/wiki/Twos_Compliment
            【解决方案8】:

            不,只有十位数字的一部分可以存储在无符号长整数中,其有效范围是 0 到 4,294,967,295 。 你可以参考这个: http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx

            【讨论】:

              【解决方案9】:

              unsigned long int 在 32 位计算机上可以保存十位数字 (1,000,000,000 - 9,999,999,999)。

              没有

              【讨论】:

                【解决方案10】:

                您应该查看给定类型的 numeric_limits 模板的特化。它在标题中。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2012-07-27
                  • 2019-04-03
                  • 2020-11-25
                  • 2016-06-10
                  • 1970-01-01
                  • 2017-06-22
                  • 1970-01-01
                  • 2012-10-18
                  相关资源
                  最近更新 更多