簡體   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