繁体   English   中英

返回的uint64_t似乎被截断了

[英]Returned uint64_t seems truncated

我想返回一个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位。

要弄清楚为什么:您是否使用原型正确声明了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>头文件中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM