werfen Sie einen Blick darauf. Der Compiler beschwert sich, dass ich einen Integer-Überlauf habe, aber wenn ich mir die Regeln des C89-Standards für integrale Werbung zusammen mit den Werten in diesem Ausdruck ansehe, scheint mir, dass es keinen Überlauf gibt.
%Vor%Außerdem bestätigt Google, dass die Antwort von 2661195264 der richtige Wert für diesen Ausdruck ist! ( Siehe diesen Link )
Wie kommt es, dass das Programm bei einem Integer-Überlauf einen korrekten Wert erzeugen kann? Und was noch wichtiger ist: Wie kommt es, dass in diesem Ausdruck anfangs ein Integer-Überlauf vorlag?
hat den Wert 2155905024
; Die größte darstellbare signierte 32-Bit int
ist 2147483647
, Sie haben also tatsächlich einen Überlauf erzeugt. Es hat dir zufällig das erwartete Ergebnis gegeben (du hattest Glück).
Beachten Sie, dass Ihr gesamter Initialisierer den Typ signed hat (geben Sie speziell int
ein), da keines der Literale ein Suffix hat. Der Ausdruck wird als vorzeichenbehaftetes int ausgewertet, und der resultierende Wert wird in eine vorzeichenlose Ganzzahl konvertiert.
Obwohl Ihre Konstanten alle positiv sind, sind sie immer noch Ganzzahlen mit Vorzeichen. Sie überlaufen den Bereich einer Ganzzahl mit Vorzeichen. Das Ergebnis wird als letzter Schritt in unsigned konvertiert, wenn es der Variablen zugewiesen wird.
Die Bitmuster für Addition, Subtraktion und Multiplikation sind zwischen vorzeichenbehafteten und vorzeichenlosen Operationen identisch. Während der Compiler in diesem Fall nicht die richtige Antwort liefern muss, ist es nur das natürlichste Ergebnis.