2

そのため、新しいデータ型long longを使用していくつかのテストを行っていたときに、ちょっとした「問題」に遭遇しました (例は C++ Primer 第 6 版から来ました)。climits ライブラリを使用して、longlong longがサポートする最大数を教えてくれましたが、どちらも 9223372036854775807 になりました。

#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;
}
4

3 に答える 3

5

これが可能なのは、標準で少なくとも同じ大きさである必要longがあり、少なくとも同じ大きさである必要があるためです(C ++ 11では少なくとも64ビットしたがって、矛盾はありません。intlong longlong

long longC ++ 11については、この関連する質問を参照しください。

質問にC++のタグを付けたので、特定の型の数値制限がlimitsヘッダーに示されていること、およびC99で標準であるもの(つまり、にあるもの<climits>)がC ++で必ずしも標準であるとは限らないこと、つまり実装で定義されている可能性があることに注意してください。 。のビット数long long(または、より明確に言えば、その値の範囲)は、CC++11でのみ標準になった標準の例です。

于 2012-04-18T06:13:42.503 に答える
5

コンパイラが 'long' と 'long long' を 64 ビット整数として実装する 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
于 2012-04-18T06:15:36.223 に答える
1

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

  • int少なくとも 16 ビットである必要があります (範囲は –32,768 ~ 32,767)。
  • long少なくとも 32 ビットである必要があります (範囲は –2,147,483,648 ~ 2,147,483,647)
  • long long少なくとも 64 ビットである必要があります (範囲は –9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 まで)
于 2012-04-18T06:17:27.410 に答える