可以unsigned long int
在 32 位计算机上保存十位数字(1,000,000,000 - 9,999,999,999)吗?
此外,unsigned long int
、long int
、unsigned int
、short int
、short unsigned int
和的范围是int
多少?
您可以依赖的最小范围是:
short int
和int
:-32,767 至 32,767unsigned short int
和unsigned int
: 0 到 65,535long int
: -2,147,483,647 至 2,147,483,647unsigned 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,807unsigned long long int
: 0 到 18,446,744,073,709,551,615所以那种类型会足够大(同样,如果你有它可用的话)。
对于那些认为我在这些下限上犯了错误的人的说明:编写范围的 C 要求是为了允许一个的补码或符号大小整数表示,其中最低可表示值和最高可表示值仅不同在标志。还允许具有二进制补码表示,其中符号位 1 和所有值位 0 的值是陷阱表示而不是合法值。换句话说,int
不需要能够表示值 -32,768。
数字类型的大小在 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 位台式机上最常见的尺寸。
要找出系统的限制:
#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 中是合法的。
这里的其他人将发布指向 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 值执行此操作。
注意:这种方法不适用于浮点数(即双精度或浮点数)。
希望这可以帮助
在 C++ 中,现在使用 2 的补码方法存储 int 和其他数据。这意味着范围是:
-2147483648 to 2147483647
或 -2^31 到 2^31-1
1 位为 0 保留,因此正值小于 2^(31)
您可以使用头文件中的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;
}
输出将是: 数据类型的限制:
对于无符号数据类型,没有符号位,所有位都用于数据;而对于有符号数据类型, 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]
不,只有十位数字的一部分可以存储在无符号长整数中,其有效范围为 0 到 4,294,967,295 。你可以参考这个: http: //msdn.microsoft.com/en-us/library/s3f49ktz (VS.80).aspx
您应该查看给定类型的 numeric_limits<> 模板的特化。它在标题中。
unsigned long int 可以在 32 位计算机上保存十位数字 (1,000,000,000 - 9,999,999,999)。
不