Falsche Übergabe von uint_64_t an va_list

Jan 05 2021

Ich schreibe eine benutzerdefinierte printfFunktion und a uint64_tscheint falsch übergeben zu werden an va_list:

Problematischer Punkt:

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

Ein Teil meiner printfImplementierung, der das falsche Ergebnis liefert:

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

Beim Debuggen mit gdb dem Wert numwird 0xffffffffff00ffb7statt 0xff00ffb7dem erwarte ich, und für die nächste %C numwird zu 0. Ist das ein Standardverhalten ich bin fehle oder bin ich etwas falsch?

Antworten

4 chux-ReinstateMonica Jan 05 2021 at 02:39

Wenn 0xff00ffb7es sich uint64_tum eine variadische Funktion handelt, werfen Sie sie um.

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

0xff00ffb7hat als ganzzahlige Konstante den Typ int, unsigned, long, unsigned long, long longoder unsigned long long: den ersten, zu dem sie "passt". Mit 32-Bit int/unsigned, 0xff00ffb7wäre unsignedund wahrscheinlich die Quelle der OPs Schwierigkeit.

Das Anhängen uan eine Konstante ist eine gute Idee, um sicherzustellen, dass es sich um einen vorzeichenlosen Typ handelt.

Das Anhängen Loder LLan eine Konstante ist keine gute Idee, um eine Konstante zu versichern uint64_t. Beides könnte übereinstimmen (wird es LLoft tun), aber diese Suffixe garantieren diesen Typ nicht.

Die Verwendung von UINT64_C(0xff00ffb7)Formularen ist eine Konstante des Typs, uint_least64_tdie sicherlich mit der uint64_tvon Maschinen identisch ist uint64_t.