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


86

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

また、何の範囲はunsigned long intlong intunsigned intshort intshort unsigned int、とint

回答:


139

最小あなたが頼ることができる範囲は次のとおりです。

  • 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 int できないことを意味します。ただし、long long intC99では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

そのタイプは(再び、十分な大きさになるようならば、あなたが利用できるそれを持っているが)。


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


タイトルももともと「C / C ++」と書いてありました。
caf 2013

なぜ
longlong

1
@mohamedab​​dallah:回答の最後の段落を参照してください。C標準範囲は、1の補数または符号の大きさの表現を可能にする方法です。
caf 2016年

ああ..私はそれがint意味することに気づきましたlong int
mazend

32

数値型のサイズは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に。


整数型の最小サイズは、関連する標準によって義務付けられています(正確なサイズは義務付けられていませんが)。
caf

13

上の限界を知るために、あなたのシステムを:

#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

ここにいる他の人々は、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)では機能しません。

お役に立てれば


1
符号付き整数でこれを試すと、負の数になります。「2の補数」(リンクが提供されています)を読んでください。これらの全範囲(正と負)を簡単に取得できます。en.wikipedia.org/wiki/Twos_Compliment
Binary Worrier 2009年

8

C ++では、intおよびその他のデータが2の補数法を使用して格納されるようになりました。つまり、範囲は次のとおりです。

-2147483648 to 2147483647

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

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


4

ヘッダーファイルにある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;
}

出力は次のようになります。データ型の制限:

  • char:-128〜127
  • unsigned char:0〜255
  • 短い:-32768〜32767
  • unsigned short:0〜65535
  • int:-2147483648〜2147483647
  • unsigned int:0〜4294967295
  • 長い:-2147483648から2147483647
  • unsigned long:0〜4294967295
  • 長い長い:-9223372036854775808から9223372036854775807
  • unsigned long long:0〜18446744073709551615
  • フロート:1.17549e-038から3.40282e + 038
  • ダブル:2.22507e-308〜1.79769e + 308
  • ロングダブル:3.3621e-4932から1.18973e + 4932

2

以下のための符号なしデータ型徴候ビットは存在せず、全てのビットがデータのためのものです。一方、符号付きデータ型の場合 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]


1

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

番号



0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.