2

を返したいのです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ですか? 出力された結果が関数によって送信された値と異なることをどのように説明できますfunction()か?

4

1 に答える 1

8

その通りです。値は 32 ビットに切り捨てられています。

2 つの値を 16 進数で確認すると、最も簡単に確認できます。

1422028920000 = 0x14B178754C0
    394745024 =    0x178754C0

明らかに、最下位の 32 ビットを取得しています。

理由を理解するには:function()プロトタイプで適切に宣言していますか? そうでない場合、コンパイラは、int切り捨てを説明する暗黙の戻り値の型を使用します (32 ビットintの s があります)。

ではmain.c、次のようになります。

uint64_t function(void);

もちろん、lib.cファイルのヘッダー (たとえば、lib.h) がある場合は、次のようにする必要があります。

#include "lib.h"

代わりは。

また、使用しないでください%lluPRIu64次のように、マクロによって与えられる適切なものを使用します。

printf("%" PRIu64 " = %" PRIu64 "\n", result, function());

これらのマクロは C99 標準で追加され、<inttypes.h>ヘッダーにあります。

于 2015-02-10T12:57:23.497 に答える