整数リテラル

整数リテラル は、小数点または指数部を持たない数値です。次のように表記できます。

整数リテラルは、基数を指定する接頭部、または型を指定する接尾部を持つことがありま す。
構文図を読む構文図をスキップする
 整数リテラルの構文

>>-+-decimal_constant-----+--+---------------+-----------------><
   +-octal_constant-------+  +-+-l--+--+---+-+   
   '-hexadecimal_constant-'  | +-L--+  +-u-+ |   
                             | +-ll-+  '-U-' |   
                             | '-LL-'        |   
                             '-+-u-+--+----+-'   
                               '-U-'  +-l--+     
                                      +-L--+     
                                      +-ll-+     
                                      '-LL-'     

long long 機能

以下の 2 つの long long 機能があります。
  • C99 の long long 機能
  • C99 以外の long long 機能
IBM 拡張 これら 2 つの機能の両方に、以下の対応する拡張部分があります。
  • 関連する IBM 拡張付き C99 の long long 機能
  • C99 以外の IBM long long 拡張

C99 以外の整数リテラルの型

C99 以外のモードでは、C99 以外の IBM long long 拡張を使用可能にできます。

以下の表に、整数リテラルをリストし、C99 の long long 機能が使用可能になっていない場合に可能なデータ型を示します。
表 1. C991 以外の整数リテラルの型
表記 接尾部 プロモーション順序
    int unsigned int long int unsigned long int
IBM 拡張
long long int
IBM 拡張
unsigned long long int
10 進 なし +   + +    
8 進、16 進 なし + + + +    
すべて u または U   +   +    
10 進 l または L     + +    
8 進、16 進 l または L     + +    
すべて u または Ul または L の両方       +    
10 進 ll または LL         + +
8 進、16 進 ll または LL         + +
すべて u または Ull または LL の両方           +
注:
  1. long long 機能がいずれも使用可能になっていない場合、整数リテラルの型は、最後の 2 列を除いて、この表にあるすべての型を含みます。

C99 の整数リテラルの型

C99 モードでは、C99 の long long 機能が自動的に使用可能になります。

C99 の long long 機能を使用可能にした後、コンパイラーは C99 以外の IBM long long 拡張のすべての機能を持つようになります。範囲外のリテラルは別として、唯一の違いは、u または U を含む接尾部を持たない 10 進整数リテラルに対する特定の型指定の規則です。 C99 以外の IBM long long 拡張では範囲外のリテラルは、関連する IBM 拡張付き C99 の long long 機能では、暗黙の型 long long int または型 unsigned long long int を持つ場合があります。

以下の例は、これらの 2 つの long long モードを使用した場合のコンパイラーの動作の違いを示しています。
#include <stdio.h>

int main(){
    if(0>3999999999-4000000000){
        printf("C99 long long");
    }
    else{
        printf("non-C99 IBM long long extension");
    }
}
この例では、値 3999999999 および 4000000000 は大きすぎて 32 ビットの long int 型に収まりませんが、unsigned long 型または long long int 型に収まります。C99 の long long 機能を使用可能にすると、この 2 つの値は long long int 型を持つため、3999999999 と 4000000000 の差はマイナスです。一方、C99 以外の IBM long long 拡張を使用可能にすると、この 2 つの値は unsigned long 型を持つため、その差はプラスです。
C99 および C99 以外の両方の long long 機能が使用不可にされている場合に、以下のいずれかの接尾部を持つ整数リテラルがあると、重大なコンパイル時エラーの原因となります。
  • ll または LL
  • u または Ull または LL の両方

IBM 拡張 値が long long int 型に収まらない場合、コンパイラーは unsigned long long int 型をそのリテラルに使用する可能性があります。この場合、コンパイラーは値が大きすぎることを示すメッセージを生成します。

以下の表に、整数リテラルをリストし、C99 の long long 機能が使用可能になっている場合に可能なデータ型を示します。
表 2. C99 の整数リテラルの型
表記 接尾部 プロモーション順序
    int unsigned int long int unsigned long int long long int unsigned long long int
10 進 なし +   +   + +
8 進、16 進 なし + + + + + +
すべて u または U   +   +   +
10 進 l または L     +   + +
8 進、16 進 l または L     + + + +
すべて u または Ul または L の両方       +   +
10 進 ll または LL         + +
8 進、16 進 ll または LL         + +
すべて u または Ull または LL の両方           +

10 進整数リテラル

10 進整数リテラル は 0 から 9 までの数字 を使用できます。最初の数字を 0 にすることはできません。数字 0 で始まる整数リテラ ルは、10 進整数リテラルとしてではなく、8 進整数リテラルとして解釈されます。

構文図を読む構文図をスキップする
10 進整数リテラルの構文

                 .--------------.   
                 V              |   
>>-digit_1_to_9----digit_0_to_9-+------------------------------><

10 進リテラルの例を次に示します。

485976
5
プラス (+) またはマイナス (-) 記号は、10 進整数リテラルの前に置くことができます。演算子は、リテラルの一部としてではなく、単項演算子として扱われます。 次の例を検討してみます。
-433132211
+20

16 進整数リテラル

16 進整数リテラル は、数字 0 で始まり、その後に、x または X が続き、その後に、0 から 9 までの数字と a から f または A から F までの英字の組み合わせが続きます。英字 A (または a) から F (または f) は、それぞ れ、値 10 から 15 を表します。

構文図を読む構文図をスキップする
16 進整数リテラルの構文

           .------------------.   
           V                  |   
>>-+-0x-+----+-digit_0_to_f-+-+--------------------------------><
   '-0X-'    '-digit_0_to_F-'     

16 進整数リテラルの例を次に示します。

0x3b24 
0XF96 
0x21 
0x3AA 
0X29b 
0X4bD

8 進整数リテラル

8 進整数リテラル は、数字 0 で始ま り、その後に 0 から 7 までの数字が続きます。

構文図を読む構文図をスキップする
8 進整数リテラルの構文

      .--------------.   
      V              |   
>>-0----digit_0_to_7-+-----------------------------------------><

8 進整数リテラルの例を次に示します。

0 
0125 
034673 
03245