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?
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...)
>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.
Hab es z.B. mal so probiert: uint32_t fat_entry; fat_entry = fat_ent[0] + (fat_ent[1] << 8); Liefert -1
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...
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.
Wie gibst du es denn aus? Du musst natürlich auch bei (s)printf %u anstatt %d bzw. %i nehmen.
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)?
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.
Hab es jetzt so gemacht fat_entry = fat_ent[0] + (((uint32_t)fat_ent[1]) << 8); sollte passen.
Bernd Edlinger wrote: > Hab es jetzt so gemacht > > fat_entry = fat_ent[0] + (((uint32_t)fat_ent[1]) << 8); > > sollte passen. Sollte...
fat_entry = ((uint16_t)fat_ent[0]) | ((uint16_t)fat_ent[1] << 8); mfg Lötlackl
@ Lötlackl: Kommt aufs System an (der OP hat ja nicht geschrieben, mit was er arbeitet). Bei nem 32-Bitter machts keinen Unterschied...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.