uint8_t, uint16_t,…的格式说明符

Format specifiers for uint8_t, uint16_t, ...?

本文关键字:格式 说明符 uint16 uint8      更新时间:2023-10-16

如果我有一个整数变量,我可以使用sscanf,如下所示,使用格式说明符%d。

sscanf (line, "Value of integer: %dn", &my_integer);

哪里可以找到uint8_t, uint16_t, uint32_tuint64_t的格式说明符?

uint64_t可能有%lu.

它们在<inttypes.h>中声明为宏:SCNd8, SCNd16, SCNd32和SCNd64。示例(对于int32_t):

sscanf (line, "Value of integer: %" SCNd32 "n", &my_integer);

它们的格式是PRI(用于打印)/SCN(用于扫描),然后对应的说明符为0,u, x, x d, i,然后没有,LEAST, FAST, MAX,然后是大小(显然没有MAX的大小)。其他一些例子:PRIo8, PRIuMAX, SCNoFAST16.

编辑:顺便说一句,一个相关的问题问为什么使用这种方法。你会发现答案很有趣。

正如其他人所说,包括定义格式宏的<stdint.h>头。然而,在c++中,在包含__STDC_FORMAT_MACROS之前定义它。从stdint.h:

/* The ISO C99 standard specifies that these macros must only be
   defined if explicitly requested.  */
#if !defined __cplusplus || defined __STDC_FORMAT_MACROS

根据ISO/IEC 9899:TC27.19.6格式化输入/输出函数,没有这样的格式说明符(所以我怀疑c++ 2003中是否有)。尽管在C99的inttypes.h中有一些#define-宏,但cinttypesinttypes.h并不是当前标准的一部分。当然,固定长度的整数类型也是非标准的。

无论如何,我强烈建议使用流来代替:

<any_type> x;
f >> x;

和完成。例如:

std::stringstream ss;
uint32_t u;
std::cin >> u;

这样做的好处是,在将来的某个时候,改变变量的类型不会导致一系列微妙的错误和未定义的行为。

在C语言中,报头为<inttypes.h>,格式为SCNX8、SCNd16。

同样的头文件可能也适用于c++

读取uint64_t (typedef unsigned long long int)的正确格式是,scanf而不是sscanf, "%" SCNu64,打印也是SCNu64的例子。在您的代码中,您读取例如my_integer变量,然后执行scanf ("Value of integer:%" SCNu64, & my_integer);和写相同的,但使用printf.

您可以在<cstdint>中检查c++的类型或在<types.h>中检查C的类型。然后您可以指定当前在您的机器上编译的格式。如果变量是unsigned,那么你需要使用%u,如果变量是signed,那么使用%d。对于小于32字节的变量,您不必指定长前缀。

在我的配置中,我有64位程序,所以我的uint64_t被编译为unsigned long long int,所以这意味着使用%llu。如果你的程序将被编译为32位,你可以使用%lu,因为uint64_t将被编译为unsigned long int

但是谁还在使用x86 ?:),所以一般来说:

uint8_t, uint16_t, uint32_t - %u
uint64_t - %llu
int8_t, int16_t, int32_t - %d
int64_t -%lld

有关sscanf的使用,请参考此说明。

这些数据类型在stint .h中定义。参考这里的stint .h

优质棉细布