Wie konvertiert man am besten ein "uint8_t" in ein "sint8_t" in portablem C.
Das ist der Code, den ich mir ausgedacht habe ....
#include <stdint.h>
sint8_t DESER_SINT8(uint8_t x)
(
return
(sint8_t)((x >= (1u << 8u))
? -(UINT8_MAX - x)
: x);
)
Gibt es einen besseren/einfacheren Weg, dies zu tun? Vielleicht ein Weg, ohne eine Bedingung zu verwenden?
Edit: Danke Leute. Also, um zusammenzufassen, was ich schon gelernt ...
sint8_t
heißt eigentlichint8_t
128
wird ausgedrückt durch1 << 7
und nicht durch1 << 8
- Das 2er-Komplement ist die "Negierung um eins".
:)
Hier ist also eine aktualisierte Version meines ursprünglichen Codes:
#include <stdint.h>
int8_t DESER_INT8(uint8_t x)
(
return ((x >= (1 << 7))
? -(UINT8_MAX - x + 1)
: x);
)