www.mikrocontroller.net

Forum: Compiler & IDEs uint32_t var=1<<15; //ergibt 0xFFFF8000 ?!?!


Autor: Frank N. (betafrank)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute, ich steh grad auf dem Schlauch.

Unter WinAVR 3.4.5

wird 1<<15 zu 0xFFFF8000.

Gibts ein WorkAround (außer aufsplitten auf 4 einzelne Bytes;-)? Gibts 
noch andere Fallen mit 32-Bit? Bekannt wird es ja wohl sein?!

Gruß Frank

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank N. wrote:
> Hallo Leute, ich steh grad auf dem Schlauch.
>
> Unter WinAVR 3.4.5
>
> wird 1<<15 zu 0xFFFF8000.
>

Ja das ist auch richtig so :-)

Wie kommts?

1 ist ein int. 15 ist ebenfalls ein int.
Daher wird die ganze Operation 1 << 15 im Zahlenraum
int ausgeführt und ergibt  0x8000
Der Datentyp dafür ist natürlich ebenfalls int.

Da du aber ein long Ergebnis angegeben hast, gehe ich
mal davon aus, dass du diese 0x8000 an einen long
zugewiesen hast. Dabei muss der int natürlich auf einen
long erweitert werden. Das geschieht selbstverständlich
unter Berücksichtigung des Vorzeichens. Und da 0x8000
eine negative Zahl ist, lautet die identische negative
Zahl in long 0xFFFF8000

> Gibts ein WorkAround?

Aber sicher doch.
Du musst nur dafür sorgen, dass der Compiler von vorne herein
alles in long, bzw. unsigned long sieht. Und schon ist dein
Problem vom Tisch:

   1UL << 15

Autor: Frank N. (betafrank)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja und schon geht es...
Danke Karl Heinz - für's Augen öffnen und Lösung finden :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Laufzeitmässig könnte es allerdings besser sein, die Schiebeoperation
in int machen zu lassen und vor der Erweiterung auf long das
Vorzeichen mit einem cast auf unsigned zu unterdrücken

    (unsigned int)(1<<15)

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.