我想返回uint64_t
,但结果似乎被截断了:
在lib.c
中:
uint64_t function()
{
uint64_t timestamp = 1422028920000;
return timestamp;
}
在
main.c
中:uint64_t result = function();
printf("%llu = %llu\n", 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位。
要弄清楚为什么:您是否使用原型(prototype)正确声明了
function()
?如果不是,编译器将使用隐式返回类型int
来解释截断(您有32位int
)。在
main.c
中,您应该具有以下内容:uint64_t function(void);
当然,如果您有
lib.c
文件的 header (例如lib.h
),则应该这样做:#include "lib.h"
代替。
另外,请勿使用
%llu
。使用正确的,由宏PRIu64
给出,如下所示:printf("%" PRIu64 " = %" PRIu64 "\n", result, function());
这些宏是在C99标准中添加的,位于
<inttypes.h>
header 中。关于c - 返回的uint64_t似乎已被截断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28432224/