int64_t的printf()格式说明符和32位ANSI C中的uint64_t

时间:2018-02-07 17:57:11

标签: c

我正在编写一些32位ANSI C,使用gcc进行编译,其中我需要打印一些64位有符号和无符号整数。问题是在gcc 32位C中,int64_tuint64_t分别转换为long long int和unsigned long long int,格式说明符为%lld和{{ ANSI C不支持1}}。使用%llu中提供的格式说明符宏也没有帮助,因为这些宏转换为inttypes.h%lld。 / p>

以下代码无法编译:

%llu

使用#include <stdio.h> #include <inttypes.h> int main() { uint64_t some_int = 123456789; printf("Your int is: %"PRId64"\n", some_int); return 0; }

编译

错误信息是:

gcc main.c -ansi -Og -g -m32 -Wall -Werror -Wextra -pedantic

所以,我的问题是:我应该使用什么格式说明符来在32位ANSI C中打印双倍长度的整数?

2 个答案:

答案 0 :(得分:2)

短语&#34; ANSI C&#34;通常指1989年ISO C标准定义的语言。 1990 ISO C标准描述了完全相同的语言(它增加了一些ISO规定的部分)。 ANSI正式放弃了自己的1989标准并采用了ISO标准 - 并且还采用了ISO和C标准的1999和2011版本。所以ANSI定义的C标准是2011 ISO C标准。

由于这种模糊性,我建议避免使用短语&#34; ANSI C&#34;并指ISO标准出版的年份:C90,C99或C11。

  

我应该使用什么格式说明符在32位ANSI C中打印双倍长度的整数?

没有。

C90不支持和标题或类型long long。它不需要支持任何64位整数类型(long 可能是64位,但通常是32位。由于类型不存在,printf没有为它们提供格式说明符。

原则上,您可以使用支持64位long的C90实现(牺牲可移植性),或者您可以使用更窄的整数数组实现您自己的64位类型,从而将操作作为函数提供。 / p>

如果您可以更新您的问题以准确解释为什么您希望将自己限制为29岁版本的C标准,则可能会提供更有用的答案。我只是告诉您使用支持C99或C11的实现,但您已经表明它不是解决方案(没有解释原因)。

答案 1 :(得分:-1)

确保您可以在C89编译器中使用64位整数的一种方法:

#include <stdio.h>
#include <assert.h>
#include <limits.h>
typedef unsigned long uint64_t;

int main() {
    uint64_t some_int = 123456789;
    assert(CHAR_BIT * sizeof(long) >= 64);
    printf("Your int is: %lu\n", some_int);
    return 0;
}