我想返回一个uint64_t
,但结果似乎被截断了:
在lib.c
:中
uint64_t function()
{
uint64_t timestamp = 1422028920000;
return timestamp;
}
在main.c
:中
uint64_t result = function();
printf("%llu = %llun", result, function());
结果:
394745024 = 394745024
在编译时,我收到一个警告:
warning: format '%llu' expects argument of type 'long long unsigned int', but argument 2 has type 'uint64_t' [-Wformat]
warning: format '%llu' expects argument of type 'long long unsigned int', but argument 3 has type 'int' [-Wformat]
为什么编译器认为我的函数的返回类型是int
?我们如何解释打印的reslut与函数function()
发送的值不同?
您是对的,值被截断为32位。
通过查看十六进制中的两个值最容易验证:
1422028920000 = 0x14B178754C0
394745024 = 0x178754C0
很明显,你得到的是最低有效的32位。
要弄清楚原因:您是否使用原型正确地声明了function()
?否则,编译器将使用int
的隐式返回类型来解释截断(您有32位的int
)。
在main.c
中,您应该有这样的东西:
uint64_t function(void);
当然,如果你有一个lib.c
文件(比如lib.h
)的头,你应该只做:
#include "lib.h"
相反。
另外,不要使用%llu
。使用由宏PRIu64
给出的适当的一个,如下所示:
printf("%" PRIu64 " = %" PRIu64 "n", result, function());
这些宏是在C99标准中添加的,位于<inttypes.h>
标头中。