質問
32ビットコンピューターでunsigned long int
10桁の数字(1,000,000,000-9,999,999,999)を保持できますか?
さらに、long int
、unsigned int
、short int
、short unsigned int
、int
、および<=>の範囲は何ですか?
解決
信頼できる最小範囲は次のとおりです。
-
short int
およびint
:-32,767〜32,767 -
unsigned short int
およびunsigned int
:0〜65,535 -
long int
:-2,147,483,647〜2,147,483,647 -
unsigned long int
:0から4,294,967,295
これは、10桁の数字を保存するために信頼できない、long long int
できないことを意味します。ただし、C99のCおよびC ++ 11のC ++には、より大きな型unsigned long long int
が導入されました(この型は、それを含まない古い標準用に構築されたコンパイラによって拡張機能としてサポートされることもよくあります)。コンパイラがサポートしている場合、このタイプの最小範囲は次のとおりです。
- <=>:-9,223,372,036,854,775,807から9,223,372,036,854,775,807
- <=>:0から18,446,744,073,709,551,615
したがって、そのタイプは十分に大きくなります(使用できる場合は、 )。
これらの下限を間違えたと信じている人への注意-私はそうしていません。範囲のC要件は、表現可能な最小値と表現可能な最大値の符号のみが異なる、1の補数または符号の大きさの整数表現を可能にするように記述されています。また、符号ビット1とすべての値ビット0を持つ値が正当な値ではなく、トラップ表現である2の補数表現を持つことも許可されています。つまり、値-32,768を表すために<=>は不要である必要があります。
他のヒント
数値型のサイズはC ++標準では定義されていませんが、最小サイズは定義されています。プラットフォーム上のサイズを確認するには、数値の制限
たとえば、intの最大値は次の方法で見つけることができます。
std::numeric_limits<int>::max();
コンピューターは基数10では機能しません。つまり、メモリ内のの数がどのように表されるかにより、最大値は2 n -1の形式になります。たとえば8ビット(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とlongは同じで、それぞれが-2 31 から2 31 の間を保持できます-私の経験では、最も一般的なサイズ最新の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や精度などへのリンクを投稿します。
自分でそれを理解する方法をお話しします。
次のことを行う小さなアプリを作成します。
unsigned int ui;
std::cout << sizeof(ui));
これは(コンパイラとアーキテクチャに応じて)2、4、または8を出力します(2バイト長、4バイト長など)
4と仮定します。
4バイトが保存できる最大値が必要になりました。1バイトの最大値は(16進数で)0xFFです。 4バイトの最大値は0xに8 fが続きます(各バイトに1組のfがあり、0xはコンパイラに次の文字列が16進数であることを伝えます)。次に、プログラムを変更してその値を割り当て、結果を出力します
unsigned int ui = 0xFFFFFFFF;
std::cout << ui;
10進表記で示される、unsigned intが保持できる最大値。
これで、long、short、およびその他のINTEGERの値に関心があります。
NB:このアプローチは、浮動小数点数(つまり、doubleまたはfloat)では機能しません。
これが役立つことを願って
C ++では、2の補数メソッドを使用してintおよびその他のデータが保存されるようになりました。 つまり、範囲は次のとおりです。
-2147483648 to 2147483647
または-2 ^ 31から2 ^ 31-1
1ビットは0のために予約されているため、正の値は2 ^(31)より小さい値です
符号なしデータ型の場合、符号ビットはなく、すべてのビットはデータ用です ;一方、符号付きデータタイプの場合、MSBは符号ビットで示され、残りのビットはデータ用です。
範囲を見つけるには、次のことを行います:
ステップ:1-<!> gt;指定したデータ型のバイト数を調べます。
ステップ:2-<!> gt;次の計算を適用します。
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サイズ= 4バイト(32ビット)-<!> gt;範囲[0、(2 ^(32))-1]
signed intサイズの場合= 4バイト(32ビット)-<!> gt;範囲[-(2 ^(32-1))、(2 ^(32-1))-1]
いいえ、有効範囲が0〜4,294,967,295である符号なしlong intに格納できるのは10桁の数字の一部のみです。 これを参照できます: http://msdn.microsoft.com/en-us /library/s3f49ktz(VS.80).aspx
32ビットコンピューターで符号なしlong intは10桁の数字(1,000,000,000-9,999,999,999)を保持できます。
いいえ
numeric_limits <!> lt; <!> gt;の特殊化を確認してください。特定のタイプのテンプレート。そのヘッダーに。