【C言語】
足し算の計算結果がおかしい
0xFFFFffff + 1

long定数 接尾子Lの使い道

■0xFFFFffff + 1の計算結果は何ですか

注:LP64-gcc環境とします。

#include <stdio.h>
int main(void){
    printf("%lx\n",0xFFFFffff+1);
    printf("%lx\n",4294967295+1);
}

●出題者も間違えた実行結果は?こちら


■接尾子Lで桁あふれを回避する

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

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

$ ./a.out
1
100000001

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

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


■接尾子l(小文字のエル)は紛らわしい

#include <stdio.h>
int main(void){
    long x = 10l;
    long y = 201;
    printf("x = %ld\n",x);
    printf("y = %ld\n",y);
    long z = 30L;
    printf("z = %ld\n",z);
}

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

./a.out
x = 10
y = 201
z = 30

x = 101(百壱)になりません。
10lは10壱ではなくて10エルと書いています。


参考:

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