Ich habe einen dummen Test über Bit-Manipulation gemacht, und ich habe dieses Problem gefunden. Ich führe diesen Code aus:Linke Shift-Bits in c
Natürlich weiß ich, dass wenn i> 31, ein Überlauf erzeugt wird. Ich denke, dass beide Teile des Codes (way1 und way2) das gleiche Ergebnis ausgeben sollten. Aber ich habe diese (am Ende):
/* ... correct results from i=1 to i=31 ... */
1<<30
mul: 0x40000000 , val: 0x40000000
1<<31
mul: 0x80000000 , val: 0x80000000
1<<32
mul: **0x0** , val: **0x1**
1<<33
mul: **0x0** , val: **0x2**
Warum, wenn beiden Befehle Verschiebungen bleiben, das Programm verschiedene Ausgaben erzeugt? Es scheint, dass der Part way2 eine runde Verschiebung erzeugt, aber ich weiß nicht warum, ich glaube wirklich, dass "mul" immer den richtigen Wert hat.
ich unter einem Intel 32-Bit-Maschine, gcc Version 4.4.7
Das Ergebnis einer Schiebeoperation mit einem Verschiebungsbetrag größer als die Operandenbreite ist nach C-Standard nicht definiert. –
Nur eine Meinung, aber ich würde sagen, dass in diesen Fällen: 'mul << one' und' one << i, es ist eigentlich besser, einfach '1' zu verwenden, als ihm den Namen' one' zu geben. –
Das ist das Problem, ja. In diesem Fall verknüpft es wahrscheinlich den rechten Operanden mit 0x3F, bevor das Shft ausgeführt wird. –