整数类型可以在C ++中存储多大的值范围

时间:2009-11-30 11:12:35

标签: c++ int

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

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

10 个答案:

答案 0 :(得分:117)

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

  • 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中引入了更大的类型long long int,在C ++ 11中引入了C ++(这种类型也经常被作为扩展,由不包含它的旧标准构建的编译器)。如果您的编译器支持,此类型的最小范围是:

  • 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的补码或符号幅度整数表示,其中最低可表示值和最高可表示值仅在符号上不同。它还允许具有二进制补码表示,其中符号位1和所有值位0的值是陷阱表示而不是合法值。换句话说,int 需要能够表示值-32,768。

答案 1 :(得分:29)

虽然最小尺寸是,但C ++标准中没有定义数字类型的大小。告诉您平台大小的方法是使用numeric limits

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

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

计算机在基数10中不起作用,这意味着最大值将以2 n -1的形式出现,因为内存中的表示数如何。例如,8位(1字节)

  0100 1000

设置为1时最右边的位(数字)表示2 0 ,下一位2 1 ,然后2 2 等等直到我们到达最左边的位,如果数字是无符号代表2 7

因此数字代表2 6 + 2 3 = 64 + 8 = 72,因为右边的第4位和右边的第7位被设置。

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

11111111

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

在我的机器和int和long是相同的,每个能够保持在-2 31 到2 31 - 1.根据我的经验,最常见的大小在现代32位台式机上。

答案 2 :(得分:8)

要了解 系统的限制:

#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中合法。

答案 3 :(得分:7)

此处的其他人将发布data_sizes和精度等链接。
我要告诉你如何弄明白自己 写一个小应用程序,它将执行以下操作。

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可以容纳的最大值,如基数10表示所示。

现在为长期,短片以及您对其感兴趣的任何其他INTEGER值进行此操作。

注意:这种方法不适用于浮点数(即double或float)。

希望这有帮助

答案 4 :(得分:6)

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

-2147483648 to 2147483647

或-2 ^ 31至2 ^ 31-1

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

答案 5 :(得分:2)

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

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

步骤:1 - &gt;找出给定数据类型的字节数。

步骤:2 - &gt;应用以下计算。

      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 

例如

对于无符号int size = 4字节(32位) - &gt;范围[0,(2 ^(32)) - 1]

对于signed int size = 4字节(32位) - &gt;范围[ - (2 ^(32-1)),(2 ^(32-1)) - 1]

答案 6 :(得分:1)

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

答案 7 :(得分:0)

  

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

没有

答案 8 :(得分:0)

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

#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<<"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
    • short:-32768至32767
    • 无符号空位:0到65535
    • int:-2147483648至2147483647
    • 无符号整数:0到4294967295
    • long:-2147483648至2147483647
    • 无符号长:0到4294967295
    • long long:-9223372036854775808至9223372036854775807
    • unsigned long long:0到18446744073709551615
    • unsigned long long:0到18446744073709551615
    • 浮点数:1.17549e-038至3.40282e + 038
    • double:2.22507e-308至1.79769e + 308
    • long double:3.3621e-4932至1.18973e + 4932

答案 9 :(得分:-1)

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