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

War es hilfreich?

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 auf size_t - ssize_t nicht C ist, aber POSIX)
  • die t Längenangabe muss arbeiten mit d, i, o, u, x, X Typen
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top