【发布时间】:2010-12-21 14:37:52
【问题描述】:
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的范围是多少?
【问题讨论】:
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 位数字。但是,在 C99 中的 C 和 C++11 中的 C++ 中引入了更大的类型 long long int(这种类型也经常被为不包含它的旧标准构建的编译器作为扩展支持)。如果您的编译器支持,此类型的最小范围是:
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。
【讨论】:
int 的意思是long int。
您可以使用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;
}
输出将是: 数据类型的限制:
【讨论】:
在 C++ 中,现在 int 和其他数据使用 2 的补码方法存储。 这意味着范围是:
-2147483648 to 2147483647
或 -2^31 到 2^31-1
1 位为 0 保留,因此正值小于 2^(31)
【讨论】:
数字类型的大小在 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 位台式机上。
【讨论】:
要找出您的系统的限制:
#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 中合法。
【讨论】:
对于无符号数据类型,没有符号位,所有位都用于数据 ;而对于有符号数据类型,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]
【讨论】:
这里的其他人将发布指向数据大小和精度等的链接。
我将告诉你如何自己弄清楚。
编写一个小应用程序,它将执行以下操作。
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 值执行此操作。
注意:这种方法不适用于浮点数(即双精度或浮点数)。
希望对你有帮助
【讨论】:
不,只有十位数字的一部分可以存储在无符号长整数中,其有效范围是 0 到 4,294,967,295 。 你可以参考这个: http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx
【讨论】:
unsigned long int 在 32 位计算机上可以保存十位数字 (1,000,000,000 - 9,999,999,999)。
没有
【讨论】:
您应该查看给定类型的 numeric_limits 模板的特化。它在标题中。
【讨论】: