为什么“unsigned int64_t”在C语言中给予一个错误?

gab6jxml  于 2023-11-16  发布在  其他
关注(0)|答案(4)|浏览(179)

为什么下面的程序给予一个错误?

#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给予我一个错误?

disbfnqx

disbfnqx1#

不能在类型int64_t上应用unsigned修饰符。它仅适用于charshortintlonglong long
您可能希望使用uint64_t,它是int64_t的无符号对应项。
还要注意的是,int64_t等是在头文件stdint.h中定义的,如果你想使用这些类型,你应该包括它。

qrjkbowd

qrjkbowd2#

int64_t不是某种内置类型。尝试添加#include <stdint.h>来定义此类类型;然后使用uint64_t,这意味着您似乎想要什么。

kxxlusnw

kxxlusnw3#

int64_t是一个 * typedef名称 *。N1570 § 7.20.1.1 p1:
typedef名称int * N *_t指定一个宽度为 * N *、没有填充位和二进制补码表示的有符号整数类型。因此,int8_t表示这样一个宽度正好为8位的有符号整数类型。
标准在§ 6.7.2 p2中列出了哪些组合是法律的:

  • char
  • signed char
  • unsigned char
  • short、signed short、short int或signed short int
  • unsigned short或unsigned short int
  • int,signed int或signed int
  • unsigned int或unsigned int
  • long,long int,long int,long int,long int
  • unsigned long或unsigned long int
  • long long,long long int,long long long int,long long int
  • unsigned long long int,unsigned long long int

...

  • typedef名称

与问题无关的类型已从列表中删除。
请注意,typedef name不能与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);


你也可以或者强制转换为unsigned long long,它是64位或更高的。但是,在没有严格必要的情况下,最好避免强制转换,所以你应该首选PRIu64方法。

printf("%llu\n", (unsigned long long)i);

n3h0vuf2

n3h0vuf24#

typedefint64_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>头文件。

相关问题