Stavo solo guardando la pagina man di printf e mi è venuto in mente qualcosa. Mi chiedevo se ci fossero "avvocati linguistici" qui che potrebbero rispondere ad una domanda relativamente semplice :-P.domanda sugli identificatori di formato printf incompatibili
Così il modificatore 't' è definito come
Una successiva conversione intero corrisponde ad un argomento ptrdiff_t.
Allora, qual è supposta che accada se si combina questo con una conversione intero senza segno? Chiaramente o, u, x e X sono tutti intesi per essere interpretati come valori senza segno, mentre d e i sono firmati.
Allo stesso modo, esistono versioni firmate/non firmate per tutti i modificatori (int/unsigned int, size_t
/ssize_t
ecc. Eccetto ptrdiff_t
.
In pratica, non succede nulla di male poiché le versioni non firmate di tipi occupano la stessa quantità di spazio delle versioni firmate. Quindi il diritto dei byte viene 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
Lo standard ha qualche opinione in proposito? Penso che la risposta sarà "comportamento indefinito". Ma ho pensato che avrei chiesto;).
Questo ha niente a che fare con C++ (almeno prima di C++ 0x)? Printf() ecc sta per essere modificato in C++ 0x per conformarsi a C99? Penso che dovresti rimuovere il tag C++. –
ptrdiff_t è definito in cstddef in C++. printf ovviamente esiste anche in C++. Non sono a conoscenza di C++ 0x cambiando affatto printf. –
hrmm, sembra che C++ non abbia il modificatore c99 't'. Giusto. –