Forum: Compiler & IDEs int32_t in Bytes zerlegen


von wanda (Gast)


Lesenswert?

Ich versuch's so:
1
char3 = int32>>24;
2
char2 = int32>>16;
3
char1 = int32>>8;
4
char0 = int32;

Da kommt leider Müll raus. Liegt hier ein systematischer Fehler vor?

von Klaus W. (mfgkw)


Lesenswert?

Mehrere Fehler auf einmal:
a) mangelnder Quelltext
b) miese Fehlerbeschreibung
c) kein vorheriger Versuch, das Problem selbst zu
   lösen - ca. einmal pro Tag darf sich hier jemand die
   Mühe machen und jemandem sagen, daß man a) mit
   unvollständigen Quelltexten nichts anfangen kann,
   und b) ohne ordentliche Fehlerbeschreibung nicht helfen
   kann ("es geht nicht, sagt mir warum"), und c) erst
   mal die 156742 Threads lesen kann, in denen beschrieben
   wird, wie man Variablen in Byte splitten kann und
   umgekehrt und in denen steht, daß man a)...

von Gerhard M. (ggcode)


Lesenswert?

so eventuell

typedef union _INT32_VAL
{
    char Buffer[4];
    INT32 IntWert;
} INT32_VAL;

von Zwie B. (zwieblum)


Lesenswert?

Das macht aber nicht das selbe wie im 1. posting ...

von Gerhard M. (ggcode)


Lesenswert?

sollte es dass?

>>>>>   int32_t in Bytes zerlegen

von Hc Z. (mizch)


Lesenswert?

Na ja, es ist schwer, allgemein zu sagen, was das erste Posting macht, 
denn da es einen signed Typ verwendet, ist das Ergebnis 
compilerabhängig.  Sagen wir mal so:  Es kann sein, dass die Union 
dasselbe macht wie das erste Posting, muss aber nicht.

> Das macht aber nicht das selbe wie im 1. posting ...

So allgemein ist das nicht richtig.

von Zwie B. (zwieblum)


Lesenswert?

Wenn du den Trick mit der Union machst, fällst du bei Wechsel der 
Endianness auf die Schnauze, und das ist noch nicht mal compilerabhängig 
:-)

von Gerhard M. (ggcode)


Lesenswert?

ne fällst du nicht weil hier nur zerlegt wird und nicht interpretiert 
!!!
Du musst schon wissen was die bytes bedeuten ob float,int etc..

von Zwie B. (zwieblum)


Lesenswert?

Buffer[0] enthält bei Big/Little Endian das selbe ... ojemine ...

von Gerhard M. (ggcode)


Lesenswert?

ja genau 1 byte :-)

von Zwie B. (zwieblum)


Lesenswert?

Du programmierst unter Windows, oder?

von Gerhard M. (ggcode)


Lesenswert?

nee

von Zwie B. (zwieblum)


Lesenswert?

Du programmierst gar nicht?

von Gerhard M. (ggcode)


Lesenswert?

wie kommst zu der Annahme?

von Hc Z. (mizch)


Lesenswert?

Abgesehen davon ist Endianess sowas von typisch compilerabhängiger 
Eigenschaft (dass der sie wiederum von der Prozessorarchitektur 
ableitet, ist ein anderes Thema (und es gibt auch gemischte 
Architekturen)).

von Rolf Magnus (Gast)


Lesenswert?

wanda schrieb:
> Ich versuch's so:
> char3 = int32>>24;
> char2 = int32>>16;
> char1 = int32>>8;
> char0 = int32;
>
> Da kommt leider Müll raus. Liegt hier ein systematischer Fehler vor?

Ja.

von Zwie B. (zwieblum)


Lesenswert?

> Abgesehen davon ist Endianess sowas von typisch compilerabhängiger
> Eigenschaft (dass der sie wiederum von der Prozessorarchitektur
> ableitet, ist ein anderes Thema (und es gibt auch gemischte
> Architekturen)).

Aha. Wenn du in Assembler programmierst hast du also keine Endianess 
mehr, oder doch, oder was genau jetzt?

von wanda (Gast)


Lesenswert?

Den Tipp mit der union hatte ich auch ausprobiert, bis auf die 
Problematik der endianess sollten beide Methoden dasselbe Ergebnis 
haben. Der Fehler (Muell) wird also an anderer Stelle verursacht . 
Danke.

von Gerhard M. (ggcode)


Lesenswert?

das glaub ich weniger .....

von Karl H. (kbuchegg)


Lesenswert?

Ooooch. Glaub ich sofort.

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.