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.
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; |
SF6 schrieb: > oder so int16_t word = 0x1234; > uint8_t *bytes = (uint8_t*)&word; falsch. Es liefert auf big und Little Endian verschiedene Ergebnisse.
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
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.
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.
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?
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.
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....)
lalala schrieb: > Theoretisch > kann ein unsigned char größer als 8 bit sein, oder? dann verwendende einfach uint8_t
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.
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
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).
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 ;
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.