printf和(signed)int未知大小

use*_*080 1 c printf typedef

我的代码中定义了一个依赖于平台的类型: typedef uint64_t myType;

但是在一些更有限的平台上,它可能是32位.

我怎么printf了?就像在目前的情况下,我可以使用%llu,但如果在另一个平台上它是32位,这不是最好的主意.

我想过使用一些宏,但有人会知道更好的方法吗?我很想知道一些格式说明符,例如可以从下一个参数中获取长度.

pax*_*blo 5

由于您具有特定于平台的类型,因此使用特定于平台的格式字符串也应该很容易,例如:

#ifdef USING_64_bits
    typedef uint64_t myType;
    #define MY_TYPE_FMT PRIu64
#else
    typedef uint32_t myType;
    #define MY_TYPE_FMT PRIu32
#endif
Run Code Online (Sandbox Code Playgroud)

然后你可以用它:

myType var1 = 42, var2 = 99;
printf ("%6" MY_TYPE_FMT ", %019" MY_TYPE_FMT "\n", var1, var2);
Run Code Online (Sandbox Code Playgroud)

%从格式字符串中提取允许您动态插入其他格式说明符,例如字段宽度和填充字符.

您还会注意到我已经避免使用%llu-style格式说明符,您应该使用更具针对性的格式说明符,inttypes.h因为实现将为您提供正确的类型.


R..*_*R.. 5

只需将其转换为与所需符号匹配的最大可能整数类型,并使用以下格式:

printf("%jd", (intmax_t)x);
Run Code Online (Sandbox Code Playgroud)

或者:

printf("%ju", (uintmax_t)x);
Run Code Online (Sandbox Code Playgroud)

(问题标题要求签名,但正文使用未签名的示例,因此我已经介绍了两者。)

与使用其他答案中建议的宏相比,这要丑陋得多/更具可读性,并且也适用于您本质上不知道要使用的PRI*正确宏的类型,例如.PRIoff_t