web-dev-qa-db-ja.com

整数型がC ++に格納できる値の範囲

unsigned long intは、32ビットコンピューターで10桁の数字(1,000,000,000-9,999,999,999)を保持できますか?

さらに、unsigned long intlong intunsigned intshort intshort unsigned int、およびintの範囲は何ですか?

73
yihangho

信頼できるminimum範囲は次のとおりです。

  • 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

これは、いいえ、long intcannotが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,807
  • unsigned long long int:0〜18,446,744,073,709,551,615

そのため、そのタイプは十分に大きくなります(繰り返しますが、if利用可能です)。


私がこれらの下限を間違えたと信じている人のためのメモ-私はそうしていません。範囲のC要件は、1の補数表現または符号マグニチュード整数表現を許可するように記述されており、表現可能な最小値と表現可能な最大値は符号のみが異なります。また、符号ビット1とすべての値ビット0を持つ値が有効な値ではなくトラップ表現である2の補数表現を持つこともできます。つまり、intは、値(-32,768)を表すためにnotである必要があります。

118
caf

最小サイズは定義されていますが、数値型のサイズはC++標準では定義されていません。プラットフォーム上のサイズを確認するには、 数値の制限 を使用します

たとえば、intの最大値は次の方法で見つけることができます。

std::numeric_limits<int>::max();

コンピューターはベース10では動作しません。つまり、最大値は2の形式になります。n-1は、メモリ内のの数を表すためです。たとえば8ビット(1バイト)を取ります

  0100 1000

1に設定された場合の右端のビット(数値)は2を表します、次のビット21、その後22 そして、左端のビットに到達するまで続きます。これは、数値が符号なしの場合、2を表します。7

したがって、数字は2を表します6 + 23 = 64 + 8 =72。これは、右から4番目のビットと左から7番目のビットが設定されているためです。

すべての値を1に設定すると:

11111111

番号は(unsignedと仮定)
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 = 28 -1
そして、ご覧のとおり、これは8ビットで表現できる最大の値です。

私のマシンでは、intとlongは同じであり、それぞれ-2の間を保持できます31 2へ31 -1.私の経験では、最新の32ビットデスクトップマシンで最も一般的なサイズです。

29
Yacoby

yourシステムの制限を見つけるには:

#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
Hal Canary

ここの他の人々は、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;

これは、符号なしintが保持できる最大値であり、基数10の表現で示されています。

ロング、ショート、その他のINTEGER値については、これを実行してください。

注意:このアプローチは、浮動小数点数(つまり、doubleまたはfloat)では機能しません。

お役に立てれば

7
Binary Worrier

C++では、intおよびその他のデータは2の補数メソッドを使用して保存されます。つまり、範囲は次のとおりです。

-2147483648 to 2147483647

または-2 ^ 31から2 ^ 31-1

1ビットは0のために予約されているため、正の値は2 ^(31)より小さい値です

6
Shah Rukh Qasim

nsigned data typeの場合、符号ビットはなく、すべてのビットはデータ用です。一方、符号付きデータ型の場合、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]

符号付き整数サイズ= 4バイト(32ビット)->範囲[-(2 ^(32-1))、(2 ^(32-1))-1]

2
Ashish

いいえ、有効範囲が0〜4,294,967,295である符号なしlong intに格納できるのは10桁の数字の一部のみです。これを参照できます: http://msdn.Microsoft.com/en-us/library/s3f49ktz(VS.80).aspx

1
Raymond

特定のタイプのnumeric_limits <>テンプレートの特殊化を確認する必要があります。そのヘッダーに。

0
PaulJWilliams

符号なしlong intは、32ビットコンピューターで10桁の数字(1,000,000,000-9,999,999,999)を保持できます。

番号

0
justin