2017-06-03 38 views
-2

我写代码:Ç - ULL前缀,十六进制

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); 
} 

,并得到这个错误:

invalid suffix "1a1b2a2b3a3b4a4b" on integer constant

可以在任何一个帮助什么我的错?

+0

您应该添加六角前缀来告诉编译器,该数字是十六进制格式,而不是小数。 – lpares12

+3

试试'0x1a1b2a2b3a3b4a4b'。 – Yunnosch

+1

欢迎来到StackOverflow。 请参加[旅游]。 格式会有帮助。 – Yunnosch

回答

1

虽然你没有解释你在这段代码中想做什么,但我会试着给你一个简单的解释,说明你为什么会得到这个错误。

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

首先,在Ubuntu使用cc编译,则返回错误:

invalid suffix "a1b2a2b3a3b4a4b" on integer constant

注意,第一1未示出。

将值分配给类型为long的变量时,编译器需要整数字面量(或整数字面量+后缀L,用于long)。你的问题在于编译器将第一个1理解为一个整数字面量,将a1b2a2b3a3b4a4b理解为后缀。由于这个后缀不存在,你会得到错误。

我假设你要做的是将十六进制值1a1b2a2b3a3b4a4b分配给变量a。如果这就是你想要做的,你应该指定你输入的值是十六进制的。做到这一点的方式,是值前添加前缀0x,所以它看起来像这样:

long long a = 0x1a1b2a2b3a3b4a4b; 

有上有效的整数文本here更多信息。

无论如何,你的代码中还有很多其他的错误,比如在指定指针指向什么之前,指针指向什么值。

+0

'0x'是一个前缀。后缀在最后。 – Yunnosch

+0

@Yunnosch谢谢,完全不是我的一天。 – lpares12

+0

您想删除非C语法反引号吗?并加入一个';'完成一个完整的陈述/初始化并删除'''。 – Yunnosch

0

在分配一个十六进制值的变量,你需要0x前缀它 - 这样的:

long long a = 0x1a1b2a2b3a3b4a4b; 

但是,最糟糕的是这样的:

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

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

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

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

非常感谢您的反馈,我刚刚开始学习关于C.你会不会解释ULL是如何工作的,它应该如何在代码中加以应用? – Roman

+0

ULL是一个长签名的错误后缀 – Yunnosch

+0

如果你开始谈论缺点,那么问题并不明确地问一路获得免警告编译。 – Yunnosch