2012-04-18 8 views
2

新しいデータ型long longで少し問題が発生しました(例はC++ Primer第6版から来ています)。私はClimitsライブラリを使って、の長さがで、の長さが長くてであり、両方が9223372036854775807になったと教えてくれました。どのようにそれが可能ですか?データ型がlong longに等しい最大数をlong longでサポートするのはなぜですか?

#include <iostream> 
#include <climits> 

int main() 
{ 
    std::cout << "int size is " << sizeof(int) << " bytes." << std::endl; 
    std::cout << "short size is " << sizeof(short) << " bytes." << std::endl; 
    std::cout << "long size is " << sizeof(long) << " bytes." << std::endl; 
    std::cout << "long long size is " << sizeof(long long) << " bytes." << std::endl; 

    std::cout << "Maximum values: " << std::endl; 
    std::cout << "int: " << INT_MAX << std::endl; 
    std::cout << "short: " << SHRT_MAX << std::endl; 
    std::cout << "long: " << LONG_MAX << std::endl; 
    std::cout << "long long: " << LLONG_MAX << std::endl; 

    return 0; 
} 
+0

各データ型のために必要な*最小*サイズのため、この質問を参照してください:http://stackoverflow.com/questions/589575/size-of-int-long-etc、ノートそれ必要な最小サイズ、すなわちデータ型が指定された値よりも大きくなる可能性があります。 – Naveen

答えて

1

C99標準では、各タイプ(§5.2.4.2.1)を表すことができなければならない値の範囲を指定します。指定された値は最小サイズです。したがって、より大きな範囲を持つことを妨げるものはありません。この値を、デジタルコンピュータ上のこれらの範囲の数値を表現するのに必要な最小ビット数に変換しました。

  • intは、少なくとも16ビット(-32,768から32,767までの範囲)であるべきである
  • long少なくとも32ビット(-2,147,483,648から2,147,483,647の範囲)であるべきである
  • longlong少なくとも64ビットであるべきです(-9,223,372,036,854,775,808から9,223,372,036,854,775,807までの範囲)
+0

C標準は最小値の範囲(ビット幅ではない)だけを指定しますが、これはC++のタグ付けされた質問です。 –

+1

@MichaelFoukarakisそれは本当です。しかし、C++ 11標準はそのためのC標準を指しています。デジタルコンピュータを使用して64ビット未満で-9223372036854775808〜9223372036854775807の整数を表現する方法はありますか? – Antoine

+0

ああ、私はそれを知らなかった。多分それは答えに入れられるべきです。その範囲は、少なくとも64ビットで表現できるだけでなく、より多くのビットでも表現できます。 ;-) –

5

long少なくともintと大きくlong longなければならない標準的な義務はlong少なくとも大として(少なくとも 64ビットでなければならないので、それが可能ですC++では11)。だから矛盾はありません。

long long(C++ 11)については、this related questionを参照してください。

あなたが与えられた型の数値制限が limitsヘッダに記載されていることを念頭に疑問C++、クマをタグ付けするので

、およびC99で標準何であるか(即ち何<climits>である)で、必ずしも標準ではありませんC++、つまり実装定義されている可能性があります。 long longのビット数(またはより明示的にその値の範囲)は、C++ 11でのみ標準になったCの標準の例です。

5

コンパイラが64ビット整数として 'long'と 'long long'を実装する64ビットマシンで実行しているためです。

これを32ビットマシン用にコンパイルすると、違いが見えます。例えば:

$ g++ -m32 size.cpp 
$ ./a.out 
int size is 4 bytes. 
short size is 2 bytes. 
long size is 4 bytes. 
long long size is 8 bytes. 
Maximum values: 
int: 2147483647 
short: 32767 
long: 2147483647 
long long: 9223372036854775807 
+0

C++ 11より前の 'long long'の範囲は標準ではありませんでした。そのため、あなたの例で出力した結果は"実装定義 "であり、異なったものでした。 – juanchopanza

+0

それは単に例として意味されていました。あなたは実際にあなたのコンパイラがこれらをどのように実装しているかを知っておくべきです。私は、shortとintが両方とも16ビットのコンパイラを使用したことを覚えています。 –

+0

私は完全に同意します!しかし、ポータブルコードを書いてみたいのであれば、標準のものとそうでないものを知ることは良いことです。 – juanchopanza

関連する問題