Es sieht so aus, als ob Sie eine Plattform verwenden, bei der int
und long
die gleiche Größe haben. (Ich dies durch die Tatsache gefolgert haben, dass, wenn long
der Lage war, alle gültigen Werte zu halten, unsigned int
Sie würden das Verhalten nicht sehen, die Sie sehen.)
Dies bedeutet, dass in dem Ausdruck a*z
, sowohl a
und z
werden in unsigned long
konvertiert und das Ergebnis hat den Typ unsigned long
. (ISO/IEC 14882: 2011, 5 [Ausdruck]/9 ... "Andernfalls sollten beide Operanden in den vorzeichenlosen Integer-Typ umgewandelt werden, der dem Typ des Operanden mit Ganzzahl mit Vorzeichen entspricht.")
c
ist das Ergebnis der Umwandlung dieses Ausdrucks von unsigned long
zu long
und in Ihrem Fall führt dies zu einem Ergebnis der Implementierung (das zufällig negativ ist), da der positive Wert a*z
nicht in einer signierten long
darstellbar ist. In c/1000
wird 1000
in long
konvertiert und long
Teilung durchgeführt (kein Wortspiel beabsichtigt), was zu einem long
führt (was zufällig negativ ist) und wird gespeichert in d
.
In der Ausdrücken a*z/1000
, 1000
(ein Ausdruck des Typs int
) auf unsigned long
umgewandelt und die Teilung zwischen zwei unsigned long
was zu einem positiven Ergebnis durchgeführt. Dieses Ergebnis ist als long
darstellbar und der Wert ist unverändert beim Umwandeln in long
und Speichern zu b
.
... Weil d == c/1000. Ist das ein echtes Leben? – outis
@crushanator Tatsächlich ist a auch nicht gleich d. Hast du das gesehen? –
Warum ist 1 in diesem Beispiel nicht gleich 2: 'int a = 1; int b = 2; '? –