74449


C言語の参考書では、整数リテラルの最後に「L」を付けるとlong型になると説明されています。  
確かにメモリ上のサイズは「1」と「1L」で違っていました。  
※sizeof(1)は4、sizeof(1L)は8でした。

### 質問

メモリ上のサイズの他に「1」と「1L」で違いはあるのでしょうか？  
「1」と「1L」で演算結果が異なるケースや呼び出した関数の振る舞いが異なるケースが知りたいです。


CC BY-SA 4.0
2021-03-06T04:09:51.507
74442
2021-03-06T06:25:55.127
2021-03-06T04:24:01.107
3060
35558
question
c
C言語の整数リテラルの最後につける「L」の使いどころはどこですか？


整数リテラルの型が変わることによる影響はいくつかあります。分かりやすいのは、リテラル同士を演算してオーバーフローする場合でしょう。

`100000000`（1 億）は 32bit signed int の範囲ですが、その 2 乗は 32bit signed int
の範囲を超え、64bit signed int の範囲に入ります。このため 32bit signed int として 2 乗を行うと、結果も 32bit
signed int として格納され、オーバーフローします。

[code]

    #include <stdio.h>
    
    int main(void)
    {
        printf("%ld\n", (long)(100000000 * 100000000));  /* オーバーフローします */
        printf("%ld\n", 100000000L * 100000000L);        /* 10000000000000000 が出力されます */
        return 0;
    }
    
[/code]

[(Wandbox)](https://wandbox.org/permlink/sAND6bH4HmYAJpC9)

他にも、上のプログラムでも不自然に long にキャストしている理由でもありますが、`printf("%ld", 1);` の挙動は未定義な一方
`printf("%ld", 1L);` は正しく 1 を出力するという違いも生まれています。

また、`L` だけだと使いどころが分かりづらいですが、整数リテラルの末尾記号には他にも `UL`
などがあり、それらと組み合わせると他にも使いどころが生まれてきます。詳しくは [what is the reason for explicitly
declaring L or UL for long
values](https://stackoverflow.com/q/13134956/5989200) をご覧ください。


CC BY-SA 4.0
2021-03-06T05:58:05.530
74449
2021-03-06T06:25:55.127
2021-03-06T06:25:55.127
19110
19110
74442
answer