web-dev-qa-db-ja.com

C / C ++ではlong long

私は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よりもはるかに大きな値が生成されます。

どうして?

82
sud03r

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

long long num3 = 100000000000LL;

接尾辞LLは、リテラルをlong long型にします。 Cは、左側の型からこれを結論付けるのに十分な「スマート」ではなく、型はリテラル自体のプロパティであり、使用されているコンテキストではありません。

143
unwind

試してください:

num3 = 100000000000LL;

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

26
Arkaitz Jimenez

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

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

4
sellibitze

コードはここで問題なくコンパイルされます(その行がコメント化されていなくても、それを

num3 = 100000000000000000000;

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

1
Omry Yadan