Forum: Compiler & IDEs Bits "rausshiften"


von Boon (Gast)


Lesenswert?

Hallo, habe eine kurze Frage:

1
uint8_t opfer = 0b00000001;
2
3
void opfer(uint8_t win)
4
{ 
5
   win = opfer << 8;
6
}

Bei einer Größe von 8Bit würde der Leftshift bewirken, dass win=0 ist?

Werden die rausgeschobenen Zustände noch irgendwo gesichert oder sind 
sie beim Shiften sofort verschwunden?

MfG

von return (Gast)


Lesenswert?

Die fallen am Ende des Registers runter. Das ist der Staub auf den 
Platinen. Blowing in the wind.

von g457 (Gast)


Lesenswert?

> Bei einer Größe von 8Bit würde der Leftshift bewirken, dass win=0 ist?

Nein, undefiniert.

> Werden die rausgeschobenen Zustände noch irgendwo gesichert oder sind
> sie beim Shiften sofort verschwunden?

Nein, normalerweise(tm) kein Carry (und auch kein rotate).

von Boon (Gast)


Lesenswert?

Sehr ästhetisch :)
Also vorher sichern, ich danke dir für die schnelle Antwort.

MfG

von g457 (Gast)


Lesenswert?

> Nein, undefiniert.

.oO(..ausser es wird vorher promoted..) </ingrid>

von Boon (Gast)


Lesenswert?

Das wird nicht Null?
1
(1 << ? ) = 0

Durch was muss ich das "?" ersetzen, damit die Gleichung stimmt? Ich 
dachte, man kriegt das mit 'nem Durchshift hin...

von return (Gast)


Lesenswert?

Boon schrieb:
> Das wird nicht Null?
> (1 << ? ) = 0
>
> Durch was muss ich das "?" ersetzen, damit die Gleichung stimmt? Ich
> dachte, man kriegt das mit 'nem Durchshift hin...

Hängt von der Registergröße ab. :-)

von g457 (Gast)


Lesenswert?

So, Nachtrag: Es wird vorher promoted, es kommt also standardkonform 0 
raus.

von return (Gast)


Lesenswert?

(((uint8_t)1) << 8) == 0

von Yalu X. (yalu) (Moderator)


Lesenswert?

return schrieb:
> (((uint8_t)1) << 8) == 0

Nein, das Ergebnis des Shifts ist 256. Zu 0 wird das Ganze erst, wenn 
man es einem uint8_t zuweist, wie im Beispiel ganz am Anfang des 
Threads.

von Boon (Gast)


Lesenswert?

Also nochmal zusammenfassend:

Der oben beschriebene Programmschnipsel mit einer expliziten uint8_t 
Deklaration würde Null ergeben und die "rausgeshifteten" Bits sind nicht 
mehr zu retten.

Treffen diese zwei Aussagen zu?

von holger (Gast)


Lesenswert?

>Der oben beschriebene Programmschnipsel mit einer expliziten uint8_t
>Deklaration würde Null ergeben und die "rausgeshifteten" Bits sind nicht
>mehr zu retten.
>
>Treffen diese zwei Aussagen zu?

Ja, die ganze Funktion ist Blödsinn weil sie
sowieso wegoptimiert wird.

von typename T (Gast)


Lesenswert?

Yalu X. schrieb:
> return schrieb:
>> (((uint8_t)1) << 8) == 0
>
> Nein, das Ergebnis des Shifts ist 256. Zu 0 wird das Ganze erst, wenn
> man es einem uint8_t zuweist, wie im Beispiel ganz am Anfang des
> Threads.

Wird Null, da unsigned Überlauf definiert ist.

von return (Gast)


Lesenswert?

((uint8_t)(1 << 8)) == 0

von Yalu X. (yalu) (Moderator)


Lesenswert?

Ja, so stimmt's

von Thomas M. (thomil)


Lesenswert?

Außerdem zu beachten:

> "If the value of the right operand is negative or is greater than or equal
> to the width of the promoted left operand, the behavior is undefined."

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.