90

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

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

4

10 回答 10

148

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

  • 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 位数字。long long int但是, C99 中的 C 和 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 和所有值位 0 的值是陷阱表示而不是合法值。换句话说,int不需要能够表示值 -32,768。

于 2009-11-30T11:20:40.560 回答
35

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

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

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

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

  0100 1000

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

所以这个数字代表 2 6 + 2 3 = 64 + 8 = 72,因为从右边开始的第 4 位和左边的第 7 位都被设置了。

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

11111111

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

在我的机器上,int 和 long 是相同的,每个都能容纳在 -2 31到 2 31 - 1 之间。根据我的经验,这是现代 32 位台式机上最常见的尺寸。

于 2009-11-30T11:16:40.210 回答
16

要找出系统的限制

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

于 2013-07-24T02:43:45.920 回答
11

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

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 值执行此操作。

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

希望这可以帮助

于 2009-11-30T11:22:43.323 回答
9

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

-2147483648 to 2147483647

或 -2^31 到 2^31-1

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

于 2015-09-21T06:24:47.917 回答
7

您可以使用头文件中的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<<"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
  • 整数:-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
  • 长双:3.3621e-4932 到 1.18973e+4932
于 2019-12-13T08:33:25.040 回答
3

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

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

步骤: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]

于 2009-11-30T12:08:24.017 回答
1

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

于 2009-11-30T11:18:54.110 回答
0

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

于 2009-11-30T11:15:56.327 回答
0

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

于 2009-11-30T11:16:59.647 回答