質問

私は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;

警告を取得を開始します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top