Forum: Compiler & IDEs int => 2 * Byte Array


von Marco S. (marco_s)


Lesenswert?

Hallo,
Ich möchte eine Integerzahl über Funk senden.
=> Ich möchte Aus der Integerzahl 2 einzelne Byte machen, damit ich die 
vorhandenen Funktionen nutzen kann.


bis jetzt nutze ich
(const void*) (&meineIntegerZahl)

und
meinEmpfangenerInteger = (upperbyte << 8) | (lowerByte)

mit dem upperbyte passt auch alles, aber das andere bekomme ich nicht 
wieder :(

Auch wenn das Thema hier schon oft angesprochen wurde habe ich keine 
direkte Lösung gefunden.

von indi (Gast)


Lesenswert?

1
int integerzahl = 9999;
2
3
unsigned char byteH = (integerzahl >> 8) & 0x00FF ;
4
unsigned char byteL = (integerzahl >> 0) & 0x00FF ;

oder:
1
int integerzahl = 9999;
2
3
unsigned char byteH = integerzahl >> 8;
4
unsigned char byteL = integerzahl;

von SF6 (Gast)


Lesenswert?

oder so
1
  int16_t word = 0x1234;
2
  uint8_t *bytes = (uint8_t*)&word;

von Peter II (Gast)


Lesenswert?

SF6 schrieb:
> oder so  int16_t word = 0x1234;
>   uint8_t *bytes = (uint8_t*)&word;

falsch. Es liefert auf big und Little Endian verschiedene Ergebnisse.

von SF6 (Gast)


Lesenswert?

Peter II schrieb:
> falsch. Es liefert auf big und Little Endian verschiedene Ergebnisse.
Und wieso ist es deshalb falsch? Es macht genau das was der TE will:
> int => 2 * Byte Array

von Peter II (Gast)


Lesenswert?

SF6 schrieb:
> Und wieso ist es deshalb falsch? Es macht genau das was der TE will:

weil er damit nicht weis wo das High und lowbyte ist.

von SF6 (Gast)


Lesenswert?

Peter II schrieb:
> weil er damit nicht weis wo das High und lowbyte ist.
Wieso nicht, die Endianness seiner CPU ist konstant und ändert sich 
nicht zufällig von einem zum anderen mal.

von Dr. Sommer (Gast)


Lesenswert?

SF6 schrieb:
> Wieso nicht, die Endianness seiner CPU ist konstant und ändert sich
> nicht zufällig von einem zum anderen mal.
Vielleicht möchte er den Code ja mal auf eine andere CPU portieren. Das 
Argument "funktioniert in diesem Fall doch" ist beim Programmieren ein 
ganz schlechtes; früher oder später gehts dann schief. Dieser 
Pointer-Cast ist in C ungültig und liefert ein undefiniertes Ergebnis. 
Warum sollte man ungültigen Code schreiben, wenn die richtige Variante 
so einfach ist?

von Peter II (Gast)


Lesenswert?

SF6 schrieb:
> Wieso nicht, die Endianness seiner CPU ist konstant und ändert sich
> nicht zufällig von einem zum anderen mal.

man versucht im allgemein portablen Code zu schreiben, eventuell hat er 
ja später mal eine andere CPU?
1
unsigned char byteH = integerzahl >> 8;
2
unsigned char byteL = integerzahl;

macht das gleiche und funktioniert überall.

von lalala (Gast)


Lesenswert?

Peter II schrieb:
> man versucht im allgemein portablen Code zu schreiben, eventuell hat er
> ja später mal eine andere CPU?
> unsigned char byteH = integerzahl >> 8;
> unsigned char byteL = integerzahl;
>
> macht das gleiche und funktioniert überall.

Das das portable ist, ist aber nicht vom Standard gedeckt. Theoretisch 
kann ein unsigned char größer als 8 bit sein, oder?
Kennt jemand dazu mal ein echtes Beispiel, oder ist das das 'Monster von 
Loch Ness' der C Programmierung (jeder hat von gehört, das es existieren 
könnte, es gibt nur keine Beweise....)

von Peter II (Gast)


Lesenswert?

lalala schrieb:
> Theoretisch
> kann ein unsigned char größer als 8 bit sein, oder?

dann verwendende einfach uint8_t

von Rolf M. (rmagnus)


Lesenswert?

Peter II schrieb:
> lalala schrieb:
>> Theoretisch
>> kann ein unsigned char größer als 8 bit sein, oder?
>
> dann verwendende einfach uint8_t

Wenn unsigned char größer als 8 bit ist, gibt es allerdings gar keinen 
uint8_t.

von Marco S. (marco_s)


Lesenswert?

Danke für die vielen schnellen Antworten.
Ich habe mich für die Methode von indi entschieden.

Sie ist für mich auch am einfachsten verständlich.

LG

von Jürgen S. (starblue) Benutzerseite


Lesenswert?

Rolf Magnus schrieb:
> Peter II schrieb:
>> lalala schrieb:
>>> Theoretisch
>>> kann ein unsigned char größer als 8 bit sein, oder?
>>
>> dann verwendende einfach uint8_t
>
> Wenn unsigned char größer als 8 bit ist, gibt es allerdings gar keinen
> uint8_t.

Dann schreit der Compiler, und du kannst dich drum kümmern.
Mit unsigned char würde er evtl. unbemerkt falschen Code erzeugen
(z.B. auf TI DSPs mit int = char = 16 bit).

von Rolf M. (rmagnus)


Lesenswert?

Jürgen S. schrieb:
> Dann schreit der Compiler, und du kannst dich drum kümmern.
> Mit unsigned char würde er evtl. unbemerkt falschen Code erzeugen
> (z.B. auf TI DSPs mit int = char = 16 bit).

Bei der Pointer-Cast-Variante ja. Aber bei der Shift-Variante kommt 
nichts falsches raus, wenn man diese nimmt:

indi schrieb:
> unsigned char byteH = (integerzahl >> 8) & 0x00FF ;
> unsigned char byteL = (integerzahl >> 0) & 0x00FF ;

von Juergen (Gast)


Lesenswert?

Rolf Magnus schrieb:
> Jürgen S. schrieb:
>> Mit unsigned char würde er evtl. unbemerkt falschen Code erzeugen
>> (z.B. auf TI DSPs mit int = char = 16 bit).

Das war eine allgemeine Bemerkung, nicht nur für diesen speziellen Fall.
Mit uint8_t kannst du spezifizieren, dass du genau 8 Bit willst.

> Bei der Pointer-Cast-Variante ja. Aber bei der Shift-Variante kommt
> nichts falsches raus, wenn man diese nimmt:
>
> indi schrieb:
>> unsigned char byteH = (integerzahl >> 8) & 0x00FF ;
>> unsigned char byteL = (integerzahl >> 0) & 0x00FF ;

Wenn du das beim Programmieren bedacht hast, ist das natürlich OK.
Um das explizit zu dokumentieren, könntest du uint_least8_t nehmen.

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.