自動変換を考慮して、Cコンパイラは長整数リテラルを表す「L」をどのように解釈しますか? 次のコードを 32 ビット プラットフォーム (32 ビット長、64 ビット長) で実行すると、式 "(0xffffffffL)" が 32 ビット -1 ではなく 64 ビット整数 4294967295 にキャストされるようです。
サンプルコード:
#include <stdio.h>
int main(void)
{
long long x = 10;
long long y = (0xffffffffL);
long long z = (long)(0xffffffffL);
printf("long long x == %lld\n", x);
printf("long long y == %lld\n", y);
printf("long long z == %lld\n", z);
printf("0xffffffffL == %ld\n", 0xffffffffL);
if (x > (long)(0xffffffffL))
printf("x > (long)(0xffffffffL)\n");
else
printf("x <= (long)(0xffffffffL)\n");
if (x > (0xffffffffL))
printf("x > (0xffffffffL)\n");
else
printf("x <= (0xffffffffL)\n");
return 0;
}
出力 (32 ビット Debian で GCC 4.5.3 でコンパイル):
long long x == 10
long long y == 4294967295
long long z == -1
0xffffffffL == -1
x > (long)(0xffffffffL)
x <= (0xffffffffL)