Kann mir das einer erklären

Gast #2106414
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 */
Gast #2106427
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>
#2106453
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.
Gast #2106554
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren