Ich war gerade durch die Man-Seite für printf und etwas fiel mir auf. Ich habe mich gefragt, ob es hier "Sprachanwälte" gibt, die eine relativ einfache Frage beantworten könnten :-P.frage über inkompatible printf-format spezifizierer
So ist das 'T' Modifikator ist definiert als
A folgende ganzzahlige Umwandlung mit einem ptrdiff_t Argumente entspricht.
Was ist soll passieren, wenn Sie diese mit einem unsigned integer Umwandlung kombinieren? Offensichtlich sind o, u, x und X alle als vorzeichenlose Werte zu interpretieren, während d und i signiert sind.
Ebenso gibt es mit/ohne Vorzeichen Versionen für alle Modifikatoren (int/unsigned int, size_t
/ssize_t
usw.) außer ptrdiff_t
.
In der Praxis passiert nichts Schlimmes, da nicht signierte Versionen von Typen den gleichen Speicherplatz beanspruchen wie die signierten Versionen. Also werden die richtigen Bytes von dem Stapel entfernt.
Also nichts "schlecht" geschieht in der Tat, in den Drucken den erwarteten Wert für alle getesteten Dinge mit Ausnahme der "INT_MIN
" (unter der Annahme, dass sizeof(int) == sizeof(ptrdiff_t)
.
printf("%tu %td\n", INT_MIN, INT_MIN);
druckt
2147483648 -2147483648
auf einem 32-Bit-System
Hat der Standard irgendeine Meinung dazu? Ich denke, die Antwort wird "undefined Verhalten." Aber ich dachte, ich würde fragen;).
Enthält diese haben irgendetwas mit C++ zu tun (zumindest vor C++ 0x)? Wird printf() usw. in C++ 0x geändert, um mit C99 übereinzustimmen? Ich denke, du solltest das C++ - Tag entfernen. –
ptrdiff_t ist in Cstddef in C++ definiert. printf existiert offensichtlich auch in C++. Ich bin mir nicht bewusst, dass C++ 0x printf überhaupt ändert. –
Hrmm, scheint, dass C++ nicht den c99 't' Modifikator haben kann. Meinetwegen. –