Dies könnte für Experten hier sehr einfach oder sogar albern sein, aber ich wollte mich damit beschäftigen. Meistens schreibe ich hex Werte wie folgt in C:
%Vor%Nehmen wir an, ich versuche die ersten und letzten 16 Bits zu extrahieren, dann kann ich einfach tun:
%Vor%In einem Teil des Codes, den ich gerade lese, bin ich auf folgendes gestoßen:
%Vor%Ich habe zwei Fragen
AND
anstelle von 0xFFFF
? Wenn Sie 0x0000FFFF
einen 32-Bit-Wert mit einer Maske haben, warum? Ist es kompakt zu halten? 0x0000FFFF
als 0xFFFF
zu schreiben? Wird es in irgendeinem Kontext anders interpretiert? Sie sind auch komplett. Wenn man die führenden Nullen weglässt, ist es etwas lesbarer.
Sie sind identisch.
Und Sie nehmen an, dass Ints immer 32 Bit lang sind. Wenn Ihre Plattform 64-Bit-Ints verwendet, würden Sie es so schreiben?
%Vor%Und es gibt noch einen weiteren Grund, warum du keine Zeit damit verschwenden solltest, führende Nullen zu setzen: Du wirst versuchen, es mit Dezimalzahlen zu machen, was eine schlechte Idee ist:
%Vor% In Ihrem Beispiel ist low
ein short
(normalerweise 16bit). Daher sind die führenden Nullen nicht nur redundant, sie legen nahe, dass ein 32-Bit-Ergebnis erwartet wird, und in diesem Fall werden die oberen Bits verworfen, was wohl die Absicht des Codes verdeutlicht.
Tatsächlich in diesem Fall
%Vor%würde ausreichen, obwohl es vielleicht weniger klar ist.
Weiterhin sollten Sie nicht davon ausgehen, dass die Integer-Breite angemessen ist und stattdessen die <stdint.h>
-Typen verwenden:
Wenn Sie VC ++ verwenden, das diesen Header nicht bereitstellt, können Sie diese Implementierung
Etwas wie 0x1
heißt ein Literal, das standardmäßig ein int-Typ ist. Dies ist nicht notwendigerweise 32 Bits, abhängig von dem Compiler oder der Plattform, also ja, es gibt einen Kontext, in dem es nicht sicher ist, die führenden Nullen wegzulassen.
In eingebetteten Systemen werden beispielsweise Int-Typen gefunden, die nur 16 Bit lang sind. Wenn Sie eine längere Ganzzahl wünschen, müssen Sie long int.
verwendenIn diesem Fall bemerkt der Compiler, ob Sie vergessen haben, "L" an das Hex-Literal anzuhängen, um anzuzeigen, dass Sie den längeren Typ wollten.
%Vor%wäre bestenfalls ein Compilerfehler oder schlimmstenfalls ein unerkannter Fehler. Sie müssten
verwenden %Vor%stattdessen.
Tags und Links c