【C言語】
接尾子Lの使い道
巨大な数の桁溢れを回避する

接尾子L無しと、接尾子L有り

//接尾子Lの使い道
#include <stdint.h>
#include <limits.h>
#include <stdio.h>
void f(void){
    uint32_t     x = UINT_MAX ;
    uint64_t     y = x + 2 ;
    printf("%lx\n",y);
}
void g(void){
    uint32_t     x = UINT_MAX ;
    uint64_t     y = x + 2L ;
    printf("%lx\n",y);
}
int main(void){
    f();
    g();
}

このプログラムは以下のように表示されます

$ ./a.out
1
100000001

y = x + 2 ;と記述すると右辺をint型で計算するため桁あふれします。

y = x + 2L ;と記述すると右辺をlong型で計算するため桁あふれしません。


参考:

DCL16-C. long 値を表すには小文字の “l” ではなく大文字の “L” を使う

■添字の掛け算で桁あふれ

//gcc loop.c -fsanitize=address,undefine
#include    <stdio.h>
#include    <stdint.h>
int main(void){
    for (int i = 0; i < 4; i++){
        int64_t j = i * 0x40000000 ;
        printf("%lx\n",j);
    }
}

左辺のjが64bit型でも
i * 0x40000000の計算式でiが3の時、
INT_MAXで収まらないので桁溢れしてしまいます。

●修正例:接尾子Lを使ってlong型演算を行う

//gcc loop.c -fsanitize=address,undefine
#include    <stdio.h>
#include    <stdint.h>
int main(void){
    for (int i = 0; i < 4; i++){
        int64_t j = i * 0x40000000L ;
        printf("%lx\n",j);
    }
}

0x40000000Lと接尾子を付けるとlong型になるので桁溢れしません。