Sam P. schrieb:
> Sowas löst man Standardkonform mit einer Union, so dass keine speziellen
> Compiler-Flags mehr nötig sind:
>
1 | > union {
|
2 | > long val32;
|
3 | > short val16[2];
|
4 | > } result;
|
5 | >
|
6 | > result.val32 = a*b;
|
7 | >
|
8 | > printf("%d, %d\n", result.val16[0], result.val16[1]);
|
Was aber auch nicht standardkonform ist :-)
Der Standard sichert nur zu, daß die Komponente, die als letztes
geschrieben wurde, beim Lesen diesen Wert liefert.
In deinem Fall ist der Wert von result.val16[] undefiniert.
Als Spracherweiterung sichert GCC zu, daß type punning funktioniert.
Obiger Code geht also mit GCC, aber nicht unbedingt mit anderen
Compilern.
Siehe auch "Casting does not work as expected when optimization is
turned on" in http://gcc.gnu.org/bugs/#nonbugs
Neben Type-Punning sind natürlich auch die Aliasing-Regeln von C zu
beachten: Ein short* ist kein Alias für ein long* oder umgekehrt. Wird
also über ein long* geschrieben, kann der Compiler davon ausgehen, daß
alles, was der über ein short* bereits kennt, sich dadurch nicht ändert.