为什么以下程序会出错?
#include <stdio.h>
int main()
{
unsigned int64_t i = 12;
printf("%lld\n", i);
return 0;
}
错误:
In function 'main':
5:19: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'i'
unsigned int64_t i = 12;
^
5:19: error: 'i' undeclared (first use in this function)
5:19: note: each undeclared identifier is reported only once for each function it appears in
但是,如果我删除了 unsigned 关键字,那么它的工作正常。所以,
为什么unsigned int64_t i
会出错?
答案 0 :(得分:12)
您无法在unsigned
类型上应用int64_t
修饰符。它仅适用于char
,short
,int
,long
和long long
。
您可能希望使用uint64_t
作为int64_t
的无符号副本。
另请注意int64_t
等。在标题stdint.h
中定义,如果要使用这些类型,则应包含该标题。
答案 1 :(得分:6)
int64_t
不是一些内置类型。尝试添加#include <stdint.h>
来定义此类型;然后使用uint64_t
,这意味着您的意图。 HTH
答案 2 :(得分:2)
int64_t
是 typedef名称。 N1570§7.20.1.1p1:
typedef名称 int N _t 指定宽度为 N 的有符号整数类型,无填充 位和二进制补码表示。因此, int8_t 表示这样的签名 整数类型,宽度恰好为8位。
标准列出了§6.7.2p2中合法的组合:
- 炭
- signed char
- unsigned char
- short,signed short,short int,或signed short int
- unsigned short,或unsigned short int
- int,signed或signed int
- unsigned,或unsigned int
- long,signed long,long int或signed long int
- unsigned long,或unsigned long int
- 长,签长长,长长的int,或 签署了long long int
- unsigned long long,或unsigned long long int
...
- typedef name
已从列表中删除与问题无关的类型。
请注意,不能将typedef名称与unsigned
混合使用。
要使用无符号64位类型,您需要:
使用uint64_t
(请注意前导u
)而不使用unsigned
说明符。
uint64_t i = 12;
包括stdint.h
(或inttypes.h
),其中uint64_t
已定义。
要打印uint64_t
,您需要加入inttypes.h
并使用PRIu64
:
printf("%" PRIu64 "\n", i);
您也可以或转换为64位或更多的unsigned long long
。但是,当不是绝对必要时,最好避免施放,所以你应该更喜欢PRIu64
方法。
printf("%llu\n", (unsigned long long)i);
答案 3 :(得分:0)
typedef
的{p> int64_t
类似于:
typedef signed long long int int64_t;
所以,unsigned int64_t i;
变成了:
unsigned signed long long int i;
这显然是编译错误。
因此,请使用int64_t
代替unsigned int64_t
。
另外,在程序中添加#include <stdint.h>
头文件。