Forum: Compiler & IDEs Kann mir das einer erklären


von Blinky B. (Gast)


Lesenswert?

Hallo ihr lieben Forenmitglieder,

also ich habe mir eine Atmega32 gekauft und habe auch schon Erfahrung 
mit uC gemacht. Zur Zeit frische ich mein Wissen wieder ein wenig auf, 
bleibe jedoch im mikrocontroller-tutorial an dieser Stelle hängen.
Kann mir einer erklären, wieso Bit 31 - 16 gesetzt sind???
Müßten es nicht Zufallswerte sein zwischen 31-16?



#define MEINBIT15 15
#define MEINBIT42 42

uint32_t reg_32; /* uint32_t definiert per typedef z. B. in 
stdint.h */
uint64_t reg_64; /* uint64_t definiert per typedef z. B. in 
stdint.h */


reg_32 |= (1 << MEINBIT15);

/* FEHLER: Setzt die Bits 31 - 15,da ((int)1 << 15) == 0xFFFF8000 */

von Floh (Gast)


Lesenswert?

Alexander Herfurtner schrieb:
> Kann mir einer erklären, wieso Bit 31 - 16 gesetzt sind???
> Müßten es nicht Zufallswerte sein zwischen 31-16?

Es müsste da Bit 15 gesetzt werden.
Zeig doch mal den gesamten Code.

von Blinky B. (Gast)


Lesenswert?

Das ist der Code so wie er im Tutorial steht unter dem Punkt: integer 
promotion

<code>
#define MEINBIT15 15
#define MEINBIT42 42

uint32_t reg_32; /* uint32_t definiert per typedef z.&nbsp;B. in 
stdint.h */
uint64_t reg_64; /* uint64_t definiert per typedef z.&nbsp;B. in 
stdint.h */

reg_32 |= (1 << MEINBIT15);              /* FEHLER: Setzt die Bits 31 - 
15, da ((int)1 << 15) == 0xFFFF8000 */

reg_32 |= ((uint32_t)1 << MEINBIT15);    /* Hier wird nur Bit 15 
gesetzt. */
reg_32 |= (1L << MEINBIT15);             /* andere Schreibweise. */
reg_64 |= (1LL << MEINBIT42);            /* Hier wird nur Bit 42 
gesetzt,
                                            andere Schreibweise für 64 
Bit (long long). */
</code>

von Stefan E. (sternst)


Lesenswert?

Das Ergebnis der Operation (1 << MEINBIT15) ist ein int (also signed). 
Da reg_32 aber ein uint32_t ist, muss dieses Zwischenergebnis 
entsprechend promotet werden. Und da der Ausgangstyp signed ist, wird 
dabei das Vorzeichen erweitert.

> Müßten es nicht Zufallswerte sein zwischen 31-16?

Wenn unterschiedliche Typen zusammen "verarbeitet" werden (Zuweisungen, 
Operationen, etc), dann folgt das festen Regeln. Da gibt es keine 
Zufallswerte.

von Blinky B. (Gast)


Lesenswert?

Also ist des so zu versehen, dass an der Stelle 2^15 und 2^0 eine 1 
gesetzt wird und dann 15 mal nach links geschoben wird. Von rechts wird 
mit 0 aufgefüllt. Jedoch verstehe ich nicht, wieso die 1 an Stelle 2^15 
gesetzt wird. Das würde doch heißen, dass er eine negative Zahl 
annimmt...

(1 << MEINBIT15) --> 1000 0000 0000 0001 --> 1111 1111 1111 1111 1000 
0000 0000 0000

von Stefan E. (sternst)


Lesenswert?

Alexander Herfurtner schrieb:
> Also ist des so zu versehen, dass an der Stelle 2^15 und 2^0 eine 1
> gesetzt wird und dann 15 mal nach links geschoben wird.

Nein.

1 = 0000 0000 0000 0001

1 << 15 = 1000 0000 0000 0000 = -32768

-32768 erweitert auf uint32_t =
  1111 1111 1111 1111 1000 0000 0000 0000

von Blinky B. (Gast)


Lesenswert?

Ahhhh okai perfekt!
dankeschön!!!

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.