Uint_64_t'nin va_list'e yanlış geçişi

Jan 05 2021

Özel bir printfişlev yazıyorum ve uint64_tgörünen o ki va_list:

Sorunlu nokta:

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

printfYanlış 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 numolur ve bir sonraki için 0 olur. Bu, eksik olduğum bazı standart davranış mı yoksa yanlış bir şey mi yapıyorum?0xffffffffff00ffb70xff00ffb7%C num

Yanıtlar

4 chux-ReinstateMonica Jan 05 2021 at 02:39

Eğer 0xff00ffb7bir olması gerekiyordu uint64_tvariadic fonksiyon için, döküm.

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

0xff00ffb7, bir tamsayı sabiti olarak, int, unsigned, long, unsigned long, long longveya türüne sahiptir unsigned long long: birincisi "uyuyor". 32 bit ile int/unsigned, OP'nin sorununun kaynağı 0xff00ffb7olabilir unsignedve muhtemelen.

Ekleme ubir sabite bir olduğunu iyi bazı imzasız türüdür sigorta fikir.

Ekleme Lveya LLbir sabite bir sabittir sigorta için iyi bir fikir değildir uint64_t. İkisi de eşleşebilir ( LLgenellikle 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_toluşturur .uint64_tuint64_t