为什么 "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 修饰符。它仅适用于 charshortintlonglong 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);