我正在编写一些32位ANSI C,使用gcc
进行编译,其中我需要打印一些64位有符号和无符号整数。问题是在gcc
32位C中,int64_t
和uint64_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中打印双倍长度的整数?
答案 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;
}