C интерпретация шестнадцатеричного длинного целого литерала «L»

Как компилятор C интерпретирует букву «L», которая обозначает длинный целочисленный литерал, в свете автоматического преобразования? Следующий код, выполняемый на 32-битной платформе (длиной 32 бита и длиной 64 бита), похоже, преобразует выражение "(0xffffffffL)" в 64-битное целое число 4294967295, а не 32-битное -1.

Образец кода:

#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;
}

Вывод (скомпилирован с GCC 4.5.3 на 32-битном Debian):

long long x == 10
long long y == 4294967295
long long z == -1
0xffffffffL == -1
x > (long)(0xffffffffL)
x <= (0xffffffffL)

Ответы на вопрос(2)

Ваш ответ на вопрос