uint_64_tのva_listへの誤った受け渡し
カスタム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
num
0になる。これは私が欠けているか、私は何かを間違ってやっているいくつかの標準的な動作ですか?
回答
4 chux-ReinstateMonica
可変個引数関数の場合0xff00ffb7
はuint64_t
、それをキャストします。
printf("Number is %C", (uint64_t) 0xff00ffb7);
0xff00ffb7
は、整数定数として、int, unsigned, long, unsigned long, long long
またはのタイプを持ちunsigned long long
ます。:最初に「適合する」ものです。32ビットのint/unsigned
場合、OPの問題の原因となる可能性0xff00ffb7
がunsigned
あります。
u
定数に追加することは、それが符号なしの型であることを保証するための良い考えです。
定数にL
またはLL
を追加することは、定数がであることを保証するための良い考えではありませんuint64_t
。どちらも一致する可能性がありますが(LL
多くの場合一致します)、これらのサフィックスはそのタイプを保証するものではありません。
を使用UINT64_C(0xff00ffb7)
すると、タイプの定数が形成uint_least64_t
さuint64_t
れますuint64_t
。これは、を持っているマシンの場合と確かに同じです。