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


von Bernd E. (edi)


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?

von Johannes M. (johnny-m)


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...)

von AVRFan (Gast)


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.

von Bernd E. (edi)


Lesenswert?

Hab es z.B. mal so probiert:

uint32_t fat_entry;

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


Liefert -1

von Johannes M. (johnny-m)


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...

von Karl H. (kbuchegg)


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.

von Daniel N. (Gast)


Lesenswert?

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

von Bernd E. (edi)


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)?

von Johannes M. (johnny-m)


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.

von Bernd E. (edi)


Lesenswert?

Hab es jetzt so gemacht

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

sollte passen.

von Johannes M. (johnny-m)


Lesenswert?

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

von Lötlackl (Gast)


Lesenswert?

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

mfg Lötlackl

von Johannes M. (johnny-m)


Lesenswert?

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

von Bernd E. (edi)


Lesenswert?

Hallo,
ich verwende einen ATMega128.

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.