Ist Casting implizit in C, wenn eine Summe in einen größeren Wert umgewandelt wird?

8

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?

%Vor%

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.

    
Tom Oldbury 15.06.2017, 07:44
quelle

2 Antworten

9

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:

%Vor%

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

    
Oliver Charlesworth 15.06.2017, 07:47
quelle
5

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.

    
Lundin 15.06.2017 07:48
quelle

Tags und Links