domanda sul formato prescrittori incompatibili printf
Domanda
Stavo guardando attraverso la pagina man per printf e qualcosa si è verificato a me. Mi chiedevo se ci sono "avvocati lingua" qui che potrebbe rispondere a una relativamente semplice :-P domanda.
Così il modificatore 't' è definito come
Una successiva conversione intero corrisponde ad un argomento ptrdiff_t.
Allora, qual è dovrebbe che accada se si combina questo con una conversione intero senza segno? Chiaramente o, u, x e X tutti tutti destinati ad essere interpretati come valori senza segno, mentre d e i sono firmato.
Allo stesso modo, ci sono firmate / versioni unsigned per tutti i modificatori (int / unsigned int, size_t
/ ssize_t
, etc) tranne ptrdiff_t
.
In pratica, nulla di male accade poiché le versioni senza segno di tipi occupano la stessa quantità di spazio come le versioni firmate. Quindi la ragione di byte ottenere estratto dallo stack.
Quindi niente "cattivo" accade, infatti, nelle stampe il valore atteso per tutte le cose testate ad eccezione del "INT_MIN
" (assumendo che sizeof(int) == sizeof(ptrdiff_t)
.
printf("%tu %td\n", INT_MIN, INT_MIN);
stampe
2147483648 -2147483648
su un sistema a 32 bit.
Ha lo standard ha alcuna opinione su questo? Immagino che la risposta sarà "un comportamento indefinito." Ma ho pensato di chiedere;).
Soluzione
niente da vedere qui. Il codice che hai scritto è legale.
A soli alcuni fatti per spiegare perché:
- tutti i tipi interi firmati hanno controparti senza segno, con la stessa dimensione / requisiti di allineamento
-
ptrdiff_t
è stato prescritto per essere un tipo intero con segno dallo standard. Pertanto, esso ha un gemello senza segno. (In realtà, la logica simile vale persize_t
così -ssize_t
non è C, ma POSIX) - l'identificatore di lunghezza
t
deve lavorare cond
,i
,o
,u
,x
, tipiX