为什么" unsigned int64_t"在C中出错?

时间:2017-06-19 08:59:33

标签: c gcc unsigned int64

为什么以下程序会出错?

#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会出错?

4 个答案:

答案 0 :(得分:12)

您无法在unsigned类型上应用int64_t修饰符。它仅适用于charshortintlonglong 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>头文件。