Hex-Werte interpretieren?

8

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

  • Warum schreiben Leute AND anstelle von 0xFFFF ? Wenn Sie 0x0000FFFF einen 32-Bit-Wert mit einer Maske haben, warum? Ist es kompakt zu halten?
  • Ist es immer sicher, 0x0000FFFF als 0xFFFF zu schreiben? Wird es in irgendeinem Kontext anders interpretiert?
Legend 03.12.2010, 22:33
quelle

5 Antworten

7

Sie sind auch komplett. Wenn man die führenden Nullen weglässt, ist es etwas lesbarer.

    
Russell Borogove 03.12.2010, 22:36
quelle
3

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%     
Roddy 03.12.2010 22:41
quelle
2

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:

%Vor%

Wenn Sie VC ++ verwenden, das diesen Header nicht bereitstellt, können Sie diese Implementierung

    
Clifford 03.12.2010 22:40
quelle
1

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.

verwenden

In 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.

    
UncleO 03.12.2010 22:46
quelle
1

In Ihrem Fall sind 0x0000FFFF und 0xFFFF identisch.

Dies wäre nicht der Fall, wenn Ihre Variablen nicht vorzeichenlos wären: Ein 16-Bit-Wert von 0xFFFF bedeutet -1, was in 32 Bits 0xFFFFFFFF ist.

    
mouviciel 03.12.2010 22:49
quelle

Tags und Links