1

根据自动转换,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;
}

输出(在 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)
4

2 回答 2

7

它是一个十六进制文字,所以它的类型可以是无符号的。它适合unsigned long,所以这就是它得到的类型。见标准第 6.4.4.1 节:

整数常量的类型是可以表示其值的对应列表中的第一个。

带有后缀的十六进制文字列表L

  1. long
  2. unsigned long
  3. long long
  4. unsigned long long

由于它不适合 32-bit signed long,而是 unsigned 32-bit unsigned long,这就是它的样子。

于 2013-03-19T20:53:12.927 回答
4

问题是确定整数文字类型的规则会有所不同,具体取决于您是十进制数还是十六进制数(或八进制数)。十进制文字总是有符号的,除非后缀带有 U。如果带符号的类型不能包含值,十六进制或八进制文字也可以是无符号的。

于 2013-03-19T20:51:55.923 回答