Uint_64_t'nin va_list'e yanlış geçişi
Özel bir printf
işlev yazıyorum ve uint64_t
görünen o ki va_list
:
Sorunlu nokta:
printf("Number is %C, and the next one is %C", 0xff00ffb7, 0xffffffff);
printf
Yanlış sonuç veren uygulamamın bir parçası :
format++;
uint64_t num = va_arg(parameters, uint64_t);
Gdb ile hata ayıklarken değeri beklediğimden çok num
olur ve bir sonraki için 0 olur. Bu, eksik olduğum bazı standart davranış mı yoksa yanlış bir şey mi yapıyorum?0xffffffffff00ffb7
0xff00ffb7
%C
num
Yanıtlar
Eğer 0xff00ffb7
bir olması gerekiyordu uint64_t
variadic fonksiyon için, döküm.
printf("Number is %C", (uint64_t) 0xff00ffb7);
0xff00ffb7
, bir tamsayı sabiti olarak, int, unsigned, long, unsigned long, long long
veya türüne sahiptir unsigned long long
: birincisi "uyuyor". 32 bit ile int/unsigned
, OP'nin sorununun kaynağı 0xff00ffb7
olabilir unsigned
ve muhtemelen.
Ekleme u
bir sabite bir olduğunu iyi bazı imzasız türüdür sigorta fikir.
Ekleme L
veya LL
bir sabite bir sabittir sigorta için iyi bir fikir değildir uint64_t
. İkisi de eşleşebilir ( LL
genellikle eşleşir ), ancak bu son ekler bu türü garanti etmez.
Kullanmak , kesinlikle sahip olan makinelerde olduğu gibi UINT64_C(0xff00ffb7)
sabit bir tip uint_least64_t
oluşturur .uint64_t
uint64_t