PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bitshift


Dr.Doom
2017-11-07, 15:24:15
Howdy,
ich shifte gerade Bits unter Windows 10 64-Bit nach links mit C (VS2013) und kann mir das folgende nicht erklären:

(1)
unsigned short res; // 16 Bit
unsigned short shifty = 1;
res = (unsigned short)(shifty << 16); // res == 0 ok

(2)
unsigned integer res; //32 Bit
unsigned integer shifty = 1;
res = (unsigned integer)(shifty << 32); // res == 1 wieso?


Warum zum Henker bekomme ich bei (2) eine 1 als Ergebnis und keine 0? :confused:

Ectoplasma
2017-11-07, 16:11:27
Schau mal hier: Shift count negative or too big error - correct solution? (https://stackoverflow.com/questions/3020913/shift-count-negative-or-too-big-error-correct-solution)

Bei (1) macht der Compiler vor dem Shift eine Umwandlung nach 32 Bit, bei (2) müsste er vor dem Shift nach 64 Bit wandeln, macht er aber nicht. Du solltest bei (2) auch eine Warnung bekommen, dass das Ergebnis undefiniert ist. Falls nicht, compiliere mal nach 32-Bit, dann sollte die Warnung erscheinen.

Dr.Doom
2017-11-07, 17:18:50
Ok, ich versäumte, kundzutun, dass es eine 32-Bit-Anwendung ergibt.
Eine Warnung erhalte ich nicht -- aber ich möchte nicht ausschließen, dass jemand die Warnung abgeschaltet hat; werde ich morgen mal überprüfen.

gravitationsfeld
2017-11-07, 18:04:55
Ist UD.

"The behavior is undefined if the right operand is negative, or greater than or equal to the length in bits of the promoted left operand."

32 bits nach links shiften bei einem 32-Bit-Wert ist undefiniert. Der Compiler entfernt sehr wahrscheinlich die ganze Zeile.

Was soll das ueberhaupt, 32 bits shiften ist doch einfach nur 0 zuweisen?

Dr.Doom
2017-11-07, 19:37:13
Das da oben ist nur ein kleiner Teil der konfigurierbaren Bit-Manipulationen in der betreffenden Anwendung. Nicht jede erdenkliche Kombination der Optionen ist sinnig.

gravitationsfeld
2017-11-07, 21:02:37
Aendert halt nichts an der Aussage. << 32 auf einem "unsigned int" ist UD. Uebrigens aendert daran auch 64 bit nichts, unsigned int ist trotzdem 32 bit.

Dr.Doom
2017-11-07, 21:10:32
Du hast nach dem Sinn gefragt ("Was soll das überhaupt"): die Anzahl, um die geshiftet wird, kann eingestellt werden: hier kann man halt auch 32 einstellen, auch mehr oder weniger. Das ist eine von x Konfigurationsmöglichkeiten, und nicht jede Kombination macht einen Sinn. Ist einfach so, seit 20+ Jahren, stört keinen. Mich auch nicht. Ich will nur diverse Verhalten verstehen. Daher die ursprüngliche Frage.