整数类型可以在C ++中存储什么值范围


86

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

此外,有什么的范围unsigned long intlong intunsigned intshort intshort unsigned int,和int

Answers:


139

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

  • 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 intC99和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。


标题最初也说“ C / C ++”。
caf

为什么多长时间int正范围==负范围
穆罕默德·阿卜杜拉16-10-12

1
@mohamedab​​dallah:参见答案的最后一段:C标准范围是允许补码或符号幅度表示的方式。
caf 2013年

啊哈..我意识到那int意味着long int
mazend

32

尽管最小大小是,但是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

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

在我的机器和int和很长的都一样,每个能够-2之间保持31 2 31 - 32近代位台式机上。在我的经验中最常见的尺寸。


相关标准规定了整数类型的最小大小(尽管没有确切大小)。
caf

13

为了找出在限制你的系统:

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


9

这里的其他人将发布指向data_sizes和precision等的链接。
我将告诉您如何自己解决问题。
编写一个可以执行以下操作的小应用程序。

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;

多数民众赞成在一个无符号的int可以持有的最大值,以10为基础的表示形式。

现在,您可以做多头,短裤和您感兴趣的任何其他INTEGER值。

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

希望这可以帮助


1
如果您尝试使用带符号的整数,则会得到负数。阅读“两个人的赞美”(提供的链接),也很容易获得这些的全部范围(正面和负面)。en.wikipedia.org/wiki/Twos_Compliment
Binary Worrier


4

您可以使用头文件中的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
  • int:-2147483648至2147483647
  • unsigned int: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

2

对于无符号数据类型,没有符号位,所有位都用于数据; 而对于有符号数据类型, 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 

例如

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

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


1

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

没有



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.