Ich arbeite an einem 16-Bit-Prozessor, daher sind die meisten meiner Daten in 16-Bit, außer wo es nötig ist.
Wenn ich zwei 16-Bit-Variablen a
und b
habe und sie zusammen in eine 32-Bit-Variable summiere, was macht der Compiler?
Ist das Ergebnis in z identisch mit z = (uint32_t)x + (uint32_t)y
oder muss das Ergebnis umgewandelt werden?
Ich habe dies auf meinem Compiler versucht und die Umwandlungen scheinen keinen Unterschied zu machen, aber das könnte nur eine Kompiliererei für diesen kleinen eingebetteten Prozessor sein.
Ab C99 werden * Operanden zu arithmetischen Operanden implizit als mindestens so groß wie int
propagiert, als Teil der üblichen arithmetischen Konvertierungen . Das Verhalten Ihres Codes hängt also von der nativen Größe von int
auf Ihrer Plattform ab.
Wenn Ihr int
32-Bit ist, entspricht Ihr Code:
Wenn Ihr int
16-Bit ist, wird keine Konvertierung durchgeführt und Sie erhalten falsche Ergebnisse aufgrund eines Integer-Überlaufs.
* Vor C99 waren die Promotionsregeln weniger gut definiert (obwohl ich die Details vergessen habe).
Bei einem 16-Bit-Prozessor beträgt die Größe von int
16 Bit.
Daher wird eine Operation wie x + y
mit beiden Operanden von uint16_t
nicht implizit befördert, sondern hat bereits die gleiche Größe wie int
. Die Operation wird mit 16 Bits ausgeführt und daher in diesem Fall überläuft. Das Ergebnis der Operation wird vom Typ uint16_t
sein.
Sie müssen einen oder beide Operanden in uint32_t
umwandeln, um dies zu verhindern.
Der Typ von z
hat nichts mit der Operation +
zu tun.