uint_64_tのva_listへの誤った受け渡し

Jan 05 2021

カスタムprintf関数を書いていますが、auint64_tが正しく渡されていないようva_listです:

問題点:

printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);

printf誤った結果を生成する私の実装の一部:

format++;
uint64_t num = va_arg(parameters, uint64_t);

GDBの値でデバッグするときにnumなると0xffffffffff00ffb7するのではなく0xff00ffb7、私が期待しているし、次のために%C num0になる。これは私が欠けているか、私は何かを間違ってやっているいくつかの標準的な動作ですか?

回答

4 chux-ReinstateMonica Jan 05 2021 at 02:39

可変個引数関数の場合0xff00ffb7uint64_t、それをキャストします。

printf("Number is %C", (uint64_t) 0xff00ffb7);

0xff00ffb7は、整数定数として、int, unsigned, long, unsigned long, long longまたはのタイプを持ちunsigned long longます。:最初に「適合する」ものです。32ビットのint/unsigned場合、OPの問題の原因となる可能性0xff00ffb7unsignedあります。

u定数に追加することは、それが符号なしの型であることを保証するための良い考えです。

定数にLまたはLLを追加することは、定数がであることを保証するための良い考えではありませんuint64_t。どちらも一致する可能性がありますがLL多くの場合一致します)、これらのサフィックスはそのタイプを保証するものではありません。

を使用UINT64_C(0xff00ffb7)すると、タイプの定数が形成uint_least64_tuint64_tれますuint64_t。これは、を持っているマシンの場合と確かに同じです。