■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エルと書いています。