www.mikrocontroller.net

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


Autor: Blinky B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 */

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Blinky B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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>

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Blinky B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Blinky B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahhhh okai perfekt!
dankeschön!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.