質問
私は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;
}
私はコメント行のコメントを解除すると、コードがコンパイルされないと、エラーを与えている。
エラー:整数定数が長いタイプに対して大きすぎる
しかし、コードがコンパイルされている場合、それは、実行されるように、それは10000000000よりはるかに大きな値を生成します。
なぜ?
解決
手紙100000000000は、整数リテラル定数を作るが、その値は、型int
に対して大きすぎます。あなたはリテラル、すなわちの種類を変更する接尾辞を使用する必要があります。
long long num3 = 100000000000LL;
サフィックスLL
はタイプlong long
にリテラルになります。 Cが十分左側のタイプからこれを締結する「スマート」ではない、タイプリテラル自体の性質ではなく、それが使用される状況である。
他のヒント
試します:
num3 = 100000000000LL;
そしてところで、C ++で、これはコンパイラの拡張機能である、標準はC99の一部thatsの、長い長い定義されていません。
それはあなたがコンパイルされているどのようなモードに依存します。長い長いC ++標準の一部ではなく、唯一の(通常は)拡張機能としてサポートされていません。これは、リテラルのタイプに影響を与えます。 intは長いそうでない場合は、数を表現するのに十分なの大きさを持つ場合は、任意のサフィックスのない10進整数リテラルは、の常にint型のです。数が長いためにも大きすぎる場合、結果は実装定義(下位互換性のために省略されているlong int型のおそらくちょうど数)です。この場合、明示的に(ほとんどのコンパイラで)長い長い延長を可能にするために、LLの接尾辞を使用する必要があります。
次のC ++バージョンが正式に明示的に力リテラルの型は、少なくとも長い長いようにしたい場合を除き、あなたが任意のサフィックスを必要としない方法で、長い長いサポートします。数が長いで表現できない場合は、コンパイラが自動的にさえLL接尾辞なしで、長い長い使用しようとします。私は、これは同様にC99の行動であると考えています。
あなたのコードは、コメントを解除しても、その行で(ここでは罰金コンパイルします。
のように変更しなければなりませんでしたnum3 = 100000000000000000000;
警告を取得を開始します。