87

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 をはるかに超える値が生成されます。

なんで?

4

5 に答える 5

152

文字 100000000000 はリテラル整数定数を構成しますが、値が type に対して大きすぎますint。リテラルのタイプを変更するには、接尾辞を使用する必要があります。

long long num3 = 100000000000LL;

サフィックスLLは、リテラルを type にしlong longます。C は、左側の型からこれを結論付けるほど「スマート」ではありません。型は、それが使用されているコンテキストではなく、リテラル自体のプロパティです。

于 2009-09-22T09:02:55.850 に答える
27

試す:

num3 = 100000000000LL;

ところで、C++ ではこれはコンパイラの拡張機能です。標準では long long は定義されていません。これは C99 の一部です。

于 2009-09-22T09:03:25.283 に答える
6

コンパイルするモードによって異なります。longlongはC++標準の一部ではありませんが、(通常は)拡張機能としてのみサポートされています。これは、リテラルのタイプに影響します。接尾辞のない10進整数リテラルは、intが数値を表すのに十分な大きさの場合は常にint型であり、それ以外の場合はlong型です。数が長すぎる場合でも、結果は実装定義になります(おそらく、下位互換性のために切り捨てられたlong型intの数だけです)。この場合、(ほとんどのコンパイラで)long long拡張を有効にするには、LLサフィックスを明示的に使用する必要があります。

次のC++バージョンは、文字通りの型を少なくともlong longにすることを明示的に望まない限り、接尾辞を必要としない方法で、公式にlonglongをサポートします。数値をlongで表すことができない場合、コンパイラはLLサフィックスがなくても自動的にlonglongを使用しようとします。これはC99の動作でもあると思います。

于 2009-09-22T09:56:36.740 に答える
2

あなたのコードはここでうまくコンパイルされます(その行のコメントを外しても。

num3 = 100000000000000000000;

警告を受け取り始めます。

于 2009-09-22T09:05:25.360 に答える