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;).

È stato utile?

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 per size_t così - ssize_t non è C, ma POSIX)
  • l'identificatore di lunghezza t deve lavorare con d, i, o, u, x, tipi X
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top