为什么 "unsigned int64_t" 在 C 中会报错?
Why "unsigned int64_t" gives an error in C?
为什么下面的程序会报错?
#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
报错?
您不能对类型 int64_t
应用 unsigned
修饰符。它仅适用于 char
、short
、int
、long
和 long long
。
您可能想使用 uint64_t
,它是 int64_t
的无符号副本。
另请注意 int64_t
等人。定义在 header stdint.h
中,如果你想使用这些类型,你应该包括它。
int64_t
不是某种内置类型。尝试添加 #include <stdint.h>
来定义此类;然后使用 uint64_t
这意味着您似乎想要的。 Hth
typedef
of 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>
头文件。
int64_t
是一个 typedef 名称。 N1570 §7.20.1.1 p1:
The typedef name intN_t designates a signed integer type with width N, no padding
bits, and a two’s complement representation. Thus, int8_t denotes such a signed
integer type with a width of exactly 8 bits.
标准在 §6.7.2 p2 中列出了哪些组合是合法的:
- char
- signed char
- unsigned char
- short, signed short, short int, or signed short int
- unsigned short, or unsigned short int
- int, signed, or signed int
- unsigned, or unsigned int
- long, signed long, long int, or signed long int
- unsigned long, or unsigned long int
- long long, signed long long, long long int, or
signed long long int
- unsigned long long, or unsigned long long int
...
- typedef name
与问题无关的类型已从列表中删除。
请注意不能将 typedef 名称与 unsigned
混合使用。
要使用无符号 64 位类型,您需要:
使用不带 unsigned
说明符的 uint64_t
(注意前导 u
)。
uint64_t i = 12;
包括 stdint.h
(或 inttypes.h
),其中定义了 uint64_t
。
要打印 uint64_t
,您需要包含 inttypes.h
并使用 PRIu64
:
printf("%" PRIu64 "\n", i);
您也可以将 or 强制转换为 unsigned long long
,即 64 位或更多位。但是,如果不是绝对必要,最好避免强制转换,因此您应该更喜欢 PRIu64
方法。
printf("%llu\n", (unsigned long long)i);
为什么下面的程序会报错?
#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
报错?
您不能对类型 int64_t
应用 unsigned
修饰符。它仅适用于 char
、short
、int
、long
和 long long
。
您可能想使用 uint64_t
,它是 int64_t
的无符号副本。
另请注意 int64_t
等人。定义在 header stdint.h
中,如果你想使用这些类型,你应该包括它。
int64_t
不是某种内置类型。尝试添加 #include <stdint.h>
来定义此类;然后使用 uint64_t
这意味着您似乎想要的。 Hth
typedef
of 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>
头文件。
int64_t
是一个 typedef 名称。 N1570 §7.20.1.1 p1:
The typedef name intN_t designates a signed integer type with width N, no padding bits, and a two’s complement representation. Thus, int8_t denotes such a signed integer type with a width of exactly 8 bits.
标准在 §6.7.2 p2 中列出了哪些组合是合法的:
- char
- signed char
- unsigned char
- short, signed short, short int, or signed short int
- unsigned short, or unsigned short int
- int, signed, or signed int
- unsigned, or unsigned int
- long, signed long, long int, or signed long int
- unsigned long, or unsigned long int
- long long, signed long long, long long int, or signed long long int
- unsigned long long, or unsigned long long int
...
- typedef name
与问题无关的类型已从列表中删除。
请注意不能将 typedef 名称与 unsigned
混合使用。
要使用无符号 64 位类型,您需要:
使用不带
unsigned
说明符的uint64_t
(注意前导u
)。uint64_t i = 12;
包括
stdint.h
(或inttypes.h
),其中定义了uint64_t
。要打印
uint64_t
,您需要包含inttypes.h
并使用PRIu64
:printf("%" PRIu64 "\n", i);
您也可以将 or 强制转换为
unsigned long long
,即 64 位或更多位。但是,如果不是绝对必要,最好避免强制转换,因此您应该更喜欢PRIu64
方法。printf("%llu\n", (unsigned long long)i);