Unerwartetes Verhalten bei Linksshift !?
-
Hallo C++ Entwickler,
ist das Verhalten des unten aufgeführten Codes auf verschiedenen Compilen gleich oder ist der Code hochgradig gefährlich, da compilerabhänig?
Unter Visual C++ 2008 EE ergibt die Ausgabe folgendes:
`Itereraion 1
b=0
b=4
Itereraion 2
b=2
b=6`
Es scheint hier so zu sein, dass die 'oben' (MSB) herausgeschobenen Bits wieder 'unten' (LSB) in die Variable 'b' hineingeschoben werden.
Die Erwartung, dass ein Linksshift um 34 Bit bei einer Variablenlänge von 32 Bit für 'b' diese Variable 'b' auf 0 setzt ist hier nicht gegeben !?
Folgt dieses Verhalten einem Standard oder ist das eine 'Spezialität' meines verwendeten Compilers?
short int a; // sizeof(a) = 2 ! unsigned int b; // sizeof(b) = 4 ! a=1; b=0; for( int i = 1; i <= 2; i++) { cout << "\nItereraion " << i << "\n------------" << endl; b >>= 1; cout << "b=" << hex << b << endl; b |= (a << 34); cout << "b=" << hex << b << endl; }Danke für jeden Hinweis!
Tecranovis
-
tecranovis schrieb:
ist das Verhalten des unten aufgeführten Codes auf verschiedenen Compilen gleich oder ist der Code hochgradig gefährlich, da compilerabhänig?
Laut Standard erzeugt das undefiniertes Verhalten.
Dein Compiler sollte dir dazu auch eine Warnung ausgegeben haben.
-
short wird zu int promotet, und dein int hat 32 Bits. Wenn du also um mehr als 32 Bits shiftest, ist das Verhalten undefiniert. Ich nehme an, dass dein Compiler in der Situation den Shift um 34 als Shift um 34 mod 32, also um 2, implementiert hat.