unsigned long int
32ビットコンピューターで10桁の数字(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これは、いいえ、10桁の数字を格納するために信頼long int
できないことを意味します。ただし、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の補数または符号の大きさの整数表現を可能にするように記述されており、表現可能な最小値と表現可能な最大値は符号のみが異なります。符号ビット1とすべての値ビット0の値が正当な値ではなくトラップ表現である場合、2の補数表現を持つこともできます。つまり、値-32,768を表すことができる必要int
はありません。
int
意味することに気づきましたlong int
。
数値型のサイズはC ++標準では定義されていませんが、最小サイズは定義されています。プラットフォーム上でのサイズを確認する方法は、数値制限ことです
たとえば、intの最大値は次のように見つけることができます。
std::numeric_limits<int>::max();
コンピュータは基数10で動作しません。つまり、メモリ内での数値の表現方法により、最大値は2 n -1の形式になります。たとえば、8ビット(1バイト)
0100 1000
最も右のビット(数1)の組が2を表す場合0を次のビット2、1、次いで2 2と私たちは数が符号なしの場合は2を表し左端のビットになるまでに7。
したがって、右から4番目のビットと左から7番目のビットが設定されているため、数値は2 6 + 2 3 = 64 + 8 = 72を表します。
すべての値を1に設定した場合。
11111111
数は現在(想定される符号無し)
= 2 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 8 1 -
そして、我々が見ることができるように、それが8ビットで表現することができる可能な最大値です。
私のマシンとint型とで長い、同じ-2の間で保持することができますそれぞれ31 2への31 -近代的な32ビットのデスクトップマシン上で私の経験では、最も一般的なサイズを1に。
上の限界を知るために、あなたのシステムを:
#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バイトが格納できる最大値が必要です。1バイトの最大値は(16進数で)0xFFです。4バイトの最大値は0xの後に8つのfが続きます(各バイトにfの1つのペア、0xは、次の文字列が16進数であることをコンパイラに通知します)。次に、プログラムを変更してその値を割り当て、結果を出力します
unsigned int ui = 0xFFFFFFFF;
std::cout << ui;
これは、基数10の表現で示される、unsignedintが保持できる最大値です。
ロング、ショート、その他の興味のあるINTEGER値に対してこれを実行します。
注意:このアプローチは、浮動小数点数(つまり、doubleまたはfloat)では機能しません。
お役に立てれば
ヘッダーファイルにあるnumeric_limits<data_type>::min()
andnumeric_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
例えば
unsignedintサイズの場合= 4バイト(32ビット)->範囲[0、(2 ^(32))-1]
符号付き整数サイズ= 4バイト(32ビット)の場合->範囲[-(2 ^(32-1))、(2 ^(32-1))-1]
いいえ、有効な範囲が0〜4,294,967,295のunsigned long intに格納できるのは、10桁の数値の一部のみです。これを参照できます:http: //msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx
特定のタイプのnumeric_limits <>テンプレートの特殊化を確認する必要があります。そのヘッダーにあります。