De ce specificatorul de format pentru uint8_t și uint16_t este același (%u)? [duplicat] (Programare, C, Printf, Specificatori De Format)

Rev1.0 a intrebat.

Am găsit doar întrebări destul de nelegate între ele datorită tonei de rezultate căutând pentru printf().

De ce uint8_t nu-și specifică propriul șir de format, dar orice alt tip o face?

Din câte am înțeles printf(), trebuie să cunoască lungimea parametrilor furnizați pentru a putea analiza lista de argumente variabile.

Deoarece uint8_t și uint16_t utilizează același specificator de format %u, cum se face printf() „știe” câți octeți trebuie să proceseze? Sau există cumva un cast implicit pentru uint16_t implicat atunci când se furnizează uint8_t?

Poate că îmi scapă ceva evident.

Comentarii

  • @PaulRoub: Această întrebare este de fapt exact ceea ce motivația întrebărilor mele, mulțumesc. Mi-a scăpat folosirea „promoții întregi” ca și cuvânt cheie de căutare. –  > Por Rev1.0.
2 răspunsuri
2501

printf() este o funcție variadică. Argumentele sale opționale( și numai acestea ) sunt promovate în conformitate cu promovările argumentelor implicite( 6.5.2.2.2. p6 ).

Deoarece solicitați numere întregi, în acest caz se aplică promovările de numere întregi, iar tipurile pe care le menționați sunt promovate la int. ( și nu unsigned int deoarece C )

Dacă utilizați "%u" în printf(), și îi transmiteți un element uint16_t variabilă, atunci funcția o convertește într-o variabilă int, apoi într-un unsigned int( pentru că ați cerut-o cu %u ) și apoi o tipărește.

Comentarii

  • Această promovare se întâmplă și în cazul funcțiilor non-variante. –  > Por Basile Starynkevitch.
  • @BasileStarynkevitch Nu, nu se întâmplă. –  > Por 2501.
  • Se întâmplă, de asemenea, pentru funcțiile neprototipate, în cazul în care la asta se referă Basile. –  > Por mafso.
wick

Deoarece %u înseamnă „unsigned”, este foarte posibil să fie uint64_t și depinde de arhitectură. Conform man 3 printf, este posibil să doriți să utilizați modificatorul de lungime pentru a obține comportamentul căutat, adică %hu (uint16_t) și %hhu (uint8_t).

Comentarii

  • Vă referiți la %hhu ? Cred că modificatorul de lungime este prefixat, nu postfixat. –  > Por Bram.
  • @Bram: vă mulțumesc. Fixat. –  > Por wick.