1. Ich kann ein paar Dinge nicht verstehen. Erstens, wie kann das Hinzufügen einer vorzeichenbehafteten und einer vorzeichenlosen Zahl das Enter-Ergebnis in einen vorzeichenlosen Typ umwandeln?
Dies wird durch Integer-Promotions und Integer-Conversion-Rang definiert.
6.3.1.8 p1: Andernfalls, wenn der Operand, unsigned integer Typ hat hat Rang größer oder gleich dem Rang des Typs des anderen Operanden, dann wird der Operand mit vorzeichenbehaftete Ganzzahl-Typ wird auf die umgewandelte Typ des Operanden mit unsigned Integer-Typ.
In diesem Fall hat unsigned einen höheren Rang als int, daher wird int zu unsigned hochgestuft.
Die Umwandlung von int (-2) bis unsigned wird wie beschrieben durchgeführt:
6.3.1.3 p2: Andernfalls, wenn der neue Typ unsigned ist, wird der Wert durch wiederholte umgewandelte Hinzufügen oder Subtrahieren einer mehr als der Maximalwert, der in dem neuen Typ , bis der Wert dargestellt werden kann, ist im Bereich des neuen Typs
2. Wenn das Ergebnis in der Tat 0xFFFFFFFF von unsigned-Typ ist, warum in einem 32-Bit-System , während es mit ptr hinzugefügt wird, wird es interpretiert werden ed als ptr-1, vorausgesetzt, dass die Zahl tatsächlich vorzeichenloser Typ ist und die führende 1 nicht Zeichen bedeuten sollte?
Dies ist undefiniertes Verhalten und sollte nicht verlässlich sein, da C keinen arithmetischen Zeigerüberlauf definiert.
6.5.6 p8: Wenn sowohl der Zeiger Operand und das Ergebnis Punkt auf Elemente des gleichen Array-Objekt oder ein hinter dem letzten Element des Arrays Objekts die Auswertung darf nicht einen Überlauf erzeugen; Andernfalls ist das Verhalten undefiniert.
3. Zweitens, warum ist das Ergebnis im 64-Bit-System anders?
(Dies setzt voraus, (wie auch die Abbildung), die int und unsigned sind 4 Bytes.)
Das Ergebnis von A und B ist die gleiche wie in 1. beschrieben, dann wird dieses Ergebnis hinzugefügt der Zeiger. Da der Zeiger 8 Bytes ist und angenommen wird, dass die Addition nicht überläuft (es könnte immer noch, wenn ptr eine große Adresse hätte, die das gleiche undefinierte Verhalten wie in 2.) gibt, ist das Ergebnis eine Adresse.
Dies ist undefiniertes Verhalten, da der Zeiger weit außerhalb der Grenzen des Arrays zeigt.
Postleitzahl Hinzufügen, kein Bild von Code. – chux
Siehe http://StackOverflow.com/Questions/24864103/Replacing-Arrays-Access-Variables-with-the-Right-Integer-Type – technosaurus
Ich bin froh, dass jemand an meinem Artikel interessiert ist. Die Fragen haben bereits beantwortet. Ein wenig mehr Details über Adressarithmetik: http://www.viva64.com/en/l/0013/ Und im Allgemeinen eine Menge interessanter Dinge über die 64-Bit-Fehler: http://www.viva64.com/ en/l/full/ –