www.mikrocontroller.net

Forum: Compiler & IDEs Wie wandle ich zwei char Zeichen in eine int Zahl?


Autor: Bernd E. (edi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich kämpfe jetzt schon einige Zeit mit diesem Problem, bekomm es aber 
einfach nicht hin. Ich habe ein unsigned char array, in welches aus dem 
FAT Table die nächsten Einträge gespeichert werden, z.B. falls kein 
weiterer Cluster mehr kommt steht an Stelle 0 im Array FF und an Stelle 
1 auch FF, nun würde ich gerne aus diesen zwei Zeichen zusammen (FFFF) 
eine int Zahl erzeugen, aber irgendwie bekomme ich immer nur 0 oder -1 
raus! Kann mir jemand eine Lösung für dieses Problem nennen?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Edlinger wrote:
> Hallo,
> ich kämpfe jetzt schon einige Zeit mit diesem Problem, bekomm es aber
> einfach nicht hin. Ich habe ein unsigned char array, in welches aus dem
> FAT Table die nächsten Einträge gespeichert werden, z.B. falls kein
> weiterer Cluster mehr kommt steht an Stelle 0 im Array FF und an Stelle
> 1 auch FF, nun würde ich gerne aus diesen zwei Zeichen zusammen (FFFF)
> eine int Zahl erzeugen, aber irgendwie bekomme ich immer nur 0 oder -1
> raus! Kann mir jemand eine Lösung für dieses Problem nennen?
"-1" ist doch schon mal nicht schlecht. Schließlich ist 0xffff als 
(signed) int die Darstellung für -1... Aber es wäre durchaus 
sachdienlich, wenn Du erzählen würdest, was Du bisher unternommen hast 
(Code...)

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>würde ich gerne aus diesen zwei Zeichen zusammen (FFFF)
>eine int Zahl erzeugen, aber irgendwie bekomme ich immer nur 0 oder -1
>raus!

Warum bist Du mit -1 nicht zufrieden? Das Bitmuster 0xFFFF repräsentiert 
doch als "16 bit signed integer" (Zweierkomplement) die Zahl -1. Als "16 
bit unsigned integer" wäre es 65535.  Wenn Du Null rauskriegst, ist es 
falsch.

Autor: Bernd E. (edi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab es z.B. mal so probiert:

uint32_t fat_entry;

fat_entry = fat_ent[0] + (fat_ent[1] << 8);


Liefert -1

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Edlinger wrote:
> Hab es z.B. mal so probiert:
>
> uint32_t fat_entry;
>
> fat_entry = fat_ent[0] + (fat_ent[1] << 8);
>
>
> Liefert -1
Wenn fat_ent[] ein Array von chars ist, dann musst Du vor dem Schieben 
casten, sonst kannste auch direkt "0" da hinschreiben. Überleg mal, was 
passiert, wenn Du eine 8 Bit breite Variable um 8 Stellen nach links 
schiebst...

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

Bewertung
0 lesenswert
nicht lesenswert
Bernd Edlinger wrote:
> Hab es z.B. mal so probiert:
>
> uint32_t fat_entry;
>
> fat_entry = fat_ent[0] + (fat_ent[1] << 8);
>
>
> Liefert -1

Das kann nicht -1 liefern, da fat_entry ein unsigned Typ
ist und als solcher über kein Vorzeichen verfügt. Dein
Fehler liegt in der Ausgaberoutine, mit der du dir den
Wert ansiehst.

Wenn du signed mit unsigned mischt, musst du höllisch
aufpassen, immer den richtigen Datentyp zu haben.

Autor: Daniel N. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie gibst du es denn aus?
Du musst natürlich auch bei (s)printf %u anstatt %d bzw. %i nehmen.

Autor: Bernd E. (edi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
Ausgabe erfolgt am LCD, daher könnte es schon sein, dass da das Problem 
liegt.

@Johannes M.

wie würde die obige Codezeile richtig aussehen (mit cast)?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Edlinger wrote:
> @Johannes M.
>
> wie würde die obige Codezeile richtig aussehen (mit cast)?
Wie gesagt, Du musst fat_ent[1] vor dem Schieben in einen Datentyp 
umwandeln, der links genug Platz zum Schieben hat. Ein unsigned int 
reicht in jedem Fall.

Autor: Bernd E. (edi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab es jetzt so gemacht

fat_entry = fat_ent[0] + (((uint32_t)fat_ent[1]) << 8);

sollte passen.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd Edlinger wrote:
> Hab es jetzt so gemacht
>
> fat_entry = fat_ent[0] + (((uint32_t)fat_ent[1]) << 8);
>
> sollte passen.
Sollte...

Autor: Lötlackl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
fat_entry = ((uint16_t)fat_ent[0]) | ((uint16_t)fat_ent[1] << 8);

mfg Lötlackl

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Lötlackl:
Kommt aufs System an (der OP hat ja nicht geschrieben, mit was er 
arbeitet). Bei nem 32-Bitter machts keinen Unterschied...

Autor: Bernd E. (edi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich verwende einen ATMega128.

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.