Frage zu unvereinbar printf Formatbezeich
Frage
Ich war gerade auf der Suche durch die man-Seite für printf und etwas fiel mir ein. Ich habe mich gefragt, ob es irgendwelche „Sprache Anwälte“ hier, die eine relativ einfache Frage :-P beantworten konnte.
Also der 't' Modifikator ist definiert als
A folgende ganzzahlige Umwandlungs entspricht ein ptrdiff_t Argument.
Also, was ist soll passieren, wenn Sie mit einem unsigned integer Umwandlung kombinieren das? Offensichtlich o, u, x und X alle sollten alle als Werte ohne Vorzeichen interpretiert werden, während d und i unterzeichnet werden.
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 nichts Schlimmes passiert da nicht signierte Versionen von Typen die gleiche Menge an Speicherplatz wie die signierten Versionen besetzen. Also das Recht von Bytes erhalten vom Stapel geholt wird.
Also nichts „schlecht“ passiert in der Tat, in den Drucken der Erwartungswert 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 eine Meinung dazu? Ich meine, die Antwort ist „nicht definiertes Verhalten.“ Aber ich dachte, ich würde fragen,.)
Lösung
Nichts zu sehen. Der Code, den Sie geschrieben haben, ist legal.
Nur ein paar Fakten, warum:
- alle signierten Integer-Typen haben unsigned Pendants, mit der gleichen Größe / Ausrichtung Anforderungen
-
ptrdiff_t
ist vorgeschrieben, ein signierter Integer-Typ durch die Norm zu sein. Daher hat es einen nicht signierten Zwilling. (In der Tat gilt eine ähnliche Logik wie auch aufsize_t
-ssize_t
nicht C ist, aber POSIX) - die
t
Längenangabe muss arbeiten mitd
,i
,o
,u
,x
,X
Typen