Falsche Übergabe von uint_64_t an va_list
Ich schreibe eine benutzerdefinierte printf
Funktion und a uint64_t
scheint falsch übergeben zu werden an va_list
:
Problematischer Punkt:
printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);
Ein Teil meiner printf
Implementierung, der das falsche Ergebnis liefert:
format++;
uint64_t num = va_arg(parameters, uint64_t);
Beim Debuggen mit gdb dem Wert num
wird 0xffffffffff00ffb7
statt 0xff00ffb7
dem erwarte ich, und für die nächste %C
num
wird zu 0. Ist das ein Standardverhalten ich bin fehle oder bin ich etwas falsch?
Antworten
Wenn 0xff00ffb7
es sich uint64_t
um eine variadische Funktion handelt, werfen Sie sie um.
printf("Number is %C", (uint64_t) 0xff00ffb7);
0xff00ffb7
hat als ganzzahlige Konstante den Typ int, unsigned, long, unsigned long, long long
oder unsigned long long
: den ersten, zu dem sie "passt". Mit 32-Bit int/unsigned
, 0xff00ffb7
wäre unsigned
und wahrscheinlich die Quelle der OPs Schwierigkeit.
Das Anhängen u
an eine Konstante ist eine gute Idee, um sicherzustellen, dass es sich um einen vorzeichenlosen Typ handelt.
Das Anhängen L
oder LL
an eine Konstante ist keine gute Idee, um eine Konstante zu versichern uint64_t
. Beides könnte übereinstimmen (wird es LL
oft tun), aber diese Suffixe garantieren diesen Typ nicht.
Die Verwendung von UINT64_C(0xff00ffb7)
Formularen ist eine Konstante des Typs, uint_least64_t
die sicherlich mit der uint64_t
von Maschinen identisch ist uint64_t
.