int => 2 * Byte Array

#4023888
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.
Gast #4023890
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;
Gast #4023932
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?
Gast #4023933
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.
Gast #4024089
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....)
Persönliche Seite #4024249
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).
#4024261
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 ;
Gast #4024779
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren