[英]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.