gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 00:18:49 26 4
gpt4 key购买 nike

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com