C - ULL前缀,十六进制

时间:2017-06-03 07:43:20

标签: c integer suffix

我写了一段代码:

int main()
{
    long long a = 1a1b2a2b3a3b4a4b;
    long *p1;
    long *p2;
    long *p3;
    long *p4;
    *p1 = 1a1b;
    *p2 = 2a2b;
    *p3 = 3a3b;
    *p4 = 4a4b;

    *p1 = &p2;
    *p2 = &p3;
    *p3 = &p4;

    printf("Die folgende Zahl : %11x", &p1, &p2, &p3, &p4);
}

并收到此错误:

  

整数常量上的无效后缀“1a1b2a2b3a3b4a4b”

任何人都可以帮忙解决我的错误吗?

2 个答案:

答案 0 :(得分:1)

虽然您还没有解释您在该代码中尝试做什么,但我会尝试简要说明您收到该错误的原因。

您正在声明long long类型的变量,并为其指定值1a1b2a2b3a3b4a4b。通常,当您为变量赋值时,应该输入十进制值,正如您所看到的,1a1b2a2b3a3b4a4b不是十进制。

首先,在ubuntu中使用cc进行编译,返回错误:

  

无效后缀" a1b2a2b3a3b4a4b"在整数常量

请注意,第一个1未显示。

在为类型为long的变量赋值时,编译器需要一个整数文字(或long的整数文字+后缀L)。您的问题是编译器将第一个1理解为整数文字,将a1b2a2b3a3b4a4b理解为后缀。由于此后缀不存在,您将收到错误。

我假设您要做的是将十六进制值1a1b2a2b3a3b4a4b分配给变量a。如果这是您要执行的操作,则应指定您输入的值为十六进制。这样做的方法是在值之前添加0x前缀,所以它看起来像这样:

long long a = 0x1a1b2a2b3a3b4a4b;

有关有效整数文字here的更多信息。

无论如何,你的代码中还有很多其他的错误,例如在指定指针所指向的内容之前为指针指向一个值。

答案 1 :(得分:0)

为变量指定十六进制值时,需要在其前面添加0x - 如:

long long a = 0x1a1b2a2b3a3b4a4b;

然而,最糟糕的是:

long *p1;
.....
*p1 = 1a1b;  // note: should be 0x1a1b

在这里定义指针p1,然后为指针指向的内存赋值。这是一个巨大的错误,因为指针未初始化,即指向任何合法的记忆。

您需要先分配内存,例如:

long *p1 = malloc(sizeof(*p1));
*p1 = 0x1a1b;
....
free(p1);