返回的uint64_t似乎被截断了

Jav*_*Jav 2 c 64-bit return-type uint64

我想返回一个,uint64_t但结果似乎被截断:

lib.c:

uint64_t function()
{
    uint64_t timestamp = 1422028920000;
    return timestamp;
}
Run Code Online (Sandbox Code Playgroud)

main.c:

uint64_t result = function();
printf("%llu  =  %llu\n", result, function());
Run Code Online (Sandbox Code Playgroud)

结果:

394745024  =  394745024
Run Code Online (Sandbox Code Playgroud)

在编译时,我收到一个警告:

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]
Run Code Online (Sandbox Code Playgroud)

为什么编译器认为我的函数的返回类型是int?我们怎样才能解释打印的reslut与函数发送的值不同function()

unw*_*ind 7

你是对的,该值被截断为32位.

通过查看十六进制中的两个值来验证是最简单的:

1422028920000 = 0x14B178754C0
    394745024 =    0x178754C0
Run Code Online (Sandbox Code Playgroud)

很明显,你得到的是最不重要的32位.

弄清楚原因:你function()是否正确地宣布原型?如果没有,编译器将使用隐式返回类型int来解释截断(你有32位int).

main.c,你应该有类似的东西:

uint64_t function(void);
Run Code Online (Sandbox Code Playgroud)

当然,如果您的lib.c文件有标题(例如lib.h),您应该这样做:

#include "lib.h"
Run Code Online (Sandbox Code Playgroud)

代替.

另外,不要使用%llu.使用由宏给出的正确的一个PRIu64,如下所示:

printf("%" PRIu64 " = %" PRIu64 "\n", result, function());
Run Code Online (Sandbox Code Playgroud)

这些宏是在C99标准中添加的,位于<inttypes.h>标题中.