Forum: Mikrocontroller und Digitale Elektronik 2x char -> double


von Zahlenverdreher (Gast)


Lesenswert?

Hallo,

ich habe Probleme mit einer Umwandlung.
Ich möchte 2 Charwerte in der Form <wert1><wert2> zusammen fassen. Dabei 
ist in wert1 das höherwertige byte. Bei dem zusammengefassten handelt es 
sich dann um ein unsigned Integer. Damit wird nun ein double geladen.
Leider sind alle meine Versuche darauf hinaus gelaufen das im Double am 
ende die signed interpreation meiner Zahl steht steht.
Ich schließe daraus das der Cast vom zusammengesetzten (u)int16 zu 
double nicht funktioniert. Habe schon viele Varianten ausprobiert die 
alle zum gleichen Ergebnis geführt haben.

Könnte mir jemand ein beispiel Zeigen wie man es richtig macht?
Danke

von Peter II (Gast)


Lesenswert?

Zahlenverdreher schrieb:
> Habe schon viele Varianten ausprobiert die
> alle zum gleichen Ergebnis geführt haben.

dann zeige doch mal wie du es gemacht hast.

von Zahlenverdreher (Gast)


Lesenswert?

char wert1=0;
char wert2=0;
double wert3;
...
...
wert3 = ((unsigned int)(((unsigned int)wert1<<8) | wert2));

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Der Code geht tadellos:  http://codepad.org/HxpsyM76
Du hast also ein anderes Problem...

von Zahlenverdreher (Gast)


Lesenswert?

Ok, dann begebe ich mich mal weiter auf die Fehlersuche.
Danke für den tipp. Die seite ist cool. auch dafür danke

von Peter II (Gast)


Lesenswert?

Lothar Miller schrieb:
> Der Code geht tadellos:  http://codepad.org/HxpsyM76
> Du hast also ein anderes Problem...

scheinbar nicht wirklich, teste mal mit 200, 200

http://codepad.org/AshCkM4O

von Peter II (Gast)


Lesenswert?

Peter II schrieb:
> scheinbar nicht wirklich, teste mal mit 200, 200
>
> http://codepad.org/AshCkM4O

gut es fehlte das

unsigned vor dem char.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Peter II schrieb:
> scheinbar nicht wirklich, teste mal mit 200, 200
char ist per default signed.
Das wirkt sich offenbar irgendwie ungünstig aus...
http://codepad.org/jTyw1Cg6

Peter II schrieb:
> gut es fehlte das unsigned vor dem char.
Dass das der Cast nicht gepackt hat, wundert mich...

von Peter II (Gast)


Lesenswert?

Lothar Miller schrieb:
> char ist per default signed.

nein ist es nicht, es ist eventuell bei gcc irgendwo so. Im C standard 
ist es nicht definiert.

von Stefan E. (sternst)


Lesenswert?

Lothar Miller schrieb:
>> gut es fehlte das unsigned vor dem char.
> Dass das der Cast nicht gepackt hat, wundert mich...

Bei einem Cast auf einen größeren Typ entscheidet die Signedness des 
Ausgangs-Typs darüber, ob eine Sign-Extension stattfindet. Die 
Signedness des Ziel-Typs ist dabei irrelevant.

von Stefan E. (sternst)


Lesenswert?

Peter II schrieb:
> nein ist es nicht, es ist eventuell bei gcc irgendwo so. Im C standard
> ist es nicht definiert.

Das bedeutet aber nicht, dass es "undefined" ist. Der Standard sagt, es 
ist "implementation-defined", er reicht die Verantwortung also einfach 
weiter. Das bedeutet, dass die Signedness eines char sehr wohl immer 
definiert ist, nur eben nicht vom Standard, sondern vom jeweils 
verwendeten Compiler.

von Karl H. (kbuchegg)


Lesenswert?

In a Nutshell:

Wenn man es mit Bytes zu tun hat, dann ist plain vanilla char der 
falsche Datentyp.
unsigned char ist der Typ der Wahl.

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.