C解释十六进制长整数字“L”

时间:2013-03-19 20:49:05

标签: c casting 64-bit long-integer 32-bit

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

2 个答案:

答案 0 :(得分:7)

它是十六进制文字,因此其类型可以是无符号的。它适合unsigned long,因此它就是它的类型。见标准6.4.4.1节:

  

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

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

  1. long
  2. unsigned long
  3. long long
  4. unsigned long long
  5. 因为它不适合32位带符号的long,而是无符号的32位unsigned long,所以它就是这样。

答案 1 :(得分:4)

根据您是否有十进制数或十六进制(或八进制数),确定积分文字类型的规则会有所不同。除非带有U的后缀,否则始终会对十进制文字进行签名。如果带符号的类型不能包含该值,则十六进制或八进制文字也可以是无符号的。