私はGNUのC++コンパイラでこのコードを試していますが、その動作を理解できません:
#include <stdio.h>;
int main()
{
int num1 = 1000000000;
long num2 = 1000000000;
long long num3;
//num3 = 100000000000;
long long num4 = ~0;
printf("%u %u %u", sizeof(num1), sizeof(num2), sizeof(num3));
printf("%d %ld %lld %llu", num1, num2, num3, num4);
return 0;
}
コメント行のコメントを外すと、コードはコンパイルされず、エラーが発生します。
エラー:整数定数はlong型には大きすぎます
ただし、コードをそのままコンパイルして実行すると、10000000000よりもはるかに大きな値が生成されます。
どうして?
文字100000000000はリテラル整数定数を構成しますが、値はint
型には大きすぎます。接尾辞を使用して、リテラルのタイプを変更する必要があります。
long long num3 = 100000000000LL;
接尾辞LL
は、リテラルをlong long
型にします。 Cは、左側の型からこれを結論付けるのに十分な「スマート」ではなく、型はリテラル自体のプロパティであり、使用されているコンテキストではありません。
試してください:
num3 = 100000000000LL;
ところで、C++では、これはコンパイラ拡張であり、標準ではlong longを定義していません。これはC99の一部です。
どのモードでコンパイルするかによります。 long longはC++標準の一部ではなく、(通常)拡張としてのみサポートされています。これは、リテラルのタイプに影響します。接尾辞のない10進整数リテラルは、常にint型ですintが十分に大きい場合数値を表す場合、それ以外の場合はlongです。数値が長すぎて長すぎる場合、結果は実装定義です(おそらく、下位互換性のために切り捨てられたlong int型の数だけです)。この場合、LLサフィックスを明示的に使用してlong long拡張機能を有効にする必要があります(ほとんどのコンパイラーで)。
次のC++バージョンでは、リテラルの型を少なくともlong longにすることを明示的に望まない限り、サフィックスを必要としない方法で公式にlong longをサポートします。数値をlongで表現できない場合、コンパイラは、LLサフィックスがなくてもlong longを自動的に使用しようとします。これもC99の動作だと思います。
コードはここで問題なくコンパイルされます(その行がコメント化されていなくても、それを
num3 = 100000000000000000000;
警告の取得を開始します。