十六进制长整数字面量 "L"的C解释

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

根据自动转换,C 编译器如何解释表示长整型文字的“L”?以下代码在 32 位平台(32 位 long,64 位 long long)上运行时,似乎将表达式“(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)

最佳答案

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

The type of an integer constant is the first of the corresponding list in which its value can be represented.

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

  1. unsigned long
  2. 长长
  3. unsigned long long

因为它不适合 32 位有符号 long,而是无符号 32 位 unsigned long,所以它变成了这样。

关于十六进制长整数字面量 "L"的C解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15510151/

相关文章:

perl - 如何在 Win 64 上安装 Crypt::SSLeay?

c - STM32F0 I2C HAL 保存结构到 I2C EEPROM

c - 我的代码在 while 语句之后不执行 printf 语句

c# - System.Internal(x64 上的 .net 4.0)中 _HACK 方法的目的是什么

c++ - 在c++中强制转换是否改变变量,或者只告诉编译器它可以

PHP: cast to (array) 和 return-type: array 不一样?

64-bit - Visual Studio 中的 "Unsolvable"错误 - 如何连接到 SQL Server 2008 Express?

c - Linux, C : access() not catching permission problems, 之类的

c - 'rectype' 中的 '__STRUCT_KFIFO_COMMON' 的用途是什么?我应该如何理解这个宏?

java - 类型转换和继承中向上/向下转换的区别[Java]?