返回的 uint64_t 似乎被截断了
Returned uint64_t seems truncated
我想 return 一个 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]
为什么编译器认为我函数的 return 类型是 int
?怎么解释打印的reslut和函数发送的值不一样function()
?
你是对的,该值被截断为 32 位。
通过查看十六进制的两个值最容易验证:
1422028920000 = 0x14B178754C0
394745024 = 0x178754C0
很明显,您得到的是最低有效的 32 位。
找出原因:您是否使用原型正确声明 function()
?如果不是,编译器将使用 int
的隐式 return 类型来解释截断(您有 32 位 int
s)。
在 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.
我想 return 一个 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]
为什么编译器认为我函数的 return 类型是 int
?怎么解释打印的reslut和函数发送的值不一样function()
?
你是对的,该值被截断为 32 位。
通过查看十六进制的两个值最容易验证:
1422028920000 = 0x14B178754C0
394745024 = 0x178754C0
很明显,您得到的是最低有效的 32 位。
找出原因:您是否使用原型正确声明 function()
?如果不是,编译器将使用 int
的隐式 return 类型来解释截断(您有 32 位 int
s)。
在 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.