十六进制长整型常量“L” C解释(C interpretation of hexadecimal l

2019-08-17 18:05发布

如何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)

Answer 1:

这是字面上的十六进制,所以它的类型可以是无符号。 它适合在unsigned long ,所以这是它得到的类型。 见标准的第6.4.4.1:

类型的整数常数的是先在其值可以表示对应的列表的。

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

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

由于它不适合在32位有符号long ,但无符号的32位unsigned long ,这就是它变得。



Answer 2:

问题是,确定积分数的类型的规则,这取决于你是否有一个十进制数或十六进制(或者八进制数)是不同的。 十进制字面总是签署除非与U.后缀的十六进制或八进制文字也可以是无符号的,如果符号的类型不能包含的值。



文章来源: C interpretation of hexadecimal long integer literal “L”