Während beide Antworten richtig sind, maskiert das Bit ist hier völlig überflüssig. Dies geschieht implizit bei der Konvertierung in uint8_t
. Ohne genau Größe Integer-Typen (und die Leistung sprechen, sollten Sie bedenken, dass, weil die Leistung in der Regel am besten, wenn das native Wortgröße der Maschine verwendet wird), würde dies anders sein:
unsigned int val = 0xabcd;
unsigned int vr = val & 0xff;
assert(vr == 0xcd);
Aber wenn man wirklich müssen diese genau Größe Art haben, ist der beste Code ist IMHO
uint16_t val = 0xabcd;
uint8_t vr = (uint8_t) val;
die explizite Umwandlung ist hier die Absicht zu dokumentieren! Ohne sie wird eine gute Compiler Sie über die implizite Konvertierung warnen möglicherweise Informationen zu verlieren (und Sie sollten immer Compiler-Warnungen aktivieren, zum Beispiel für gcc -Wall -Wextra -pedantic
, Fälle zu fangen, wo Sie eine solche Umwandlung zufällig tun).
Die Leistung von allen Varianten die genau bemessen Typen verwenden sollten gleich sein, weil ein anständiger Compiler den gleichen Code für alle von ihnen emittieren. Die Version mit nur unsigned int
könnte ein bisschen besser.
[Bearbeiten]: Wie Sie über Gedächtnisleistung auch fragen: Es ist unwahrscheinlich, dass Sie durch die Verwendung uint8_t
etwas gewinnen, weil einige Architekturen Werte kleiner als die nativen Wortgröße erfordern, um Wortgrenzen ausgerichtet werden . Wenn sie es nicht benötigen, könnte es immer noch schneller sein, sie auszurichten, so dass der Compiler sich dazu entschließen könnte. Das führt nur unbenutzte Füllbytes ein.Mit gcc können Sie die Option -Os
verwenden, um die Größe zu optimieren, und da die x86
Architektur byteadressierbar ist, kann dies dazu führen, dass uint8_t
ohne Auffüllung auf einem PC verwendet wird, jedoch mit geringerer Geschwindigkeit. Die meiste Zeit, Geschwindigkeit gegen Speicher ist ein Kompromiss, können Sie entweder das eine oder das andere haben.
Löschen meiner Antwort, ich habe verpasst, dass Variablen nicht signiert sind. –
Also für unsigned type. Es wäre plattformabhängig und für einen signierten Typ würde es nicht funktionieren. –
Das Verhalten (im Code Ihrer Frage) ist gut für * unsigned * -Typen definiert. Für * signierte * Typen werden die Dinge aufgrund des Vorzeichen-Bits schwieriger zu beantworten. – Thanatos