Ich empfehle Ihnen, es genau so zu machen, wie Sie es gezeigt haben, da es das einfachste ist. Die Initialisierung -1
funktioniert immer , unabhängig von der tatsächlichen Vorzeichendarstellung, während ~
sie manchmal ein überraschendes Verhalten aufweist, da Sie den richtigen Operandentyp haben müssen. Nur dann erhalten Sie den höchsten Wert eines unsigned
Typs.
Betrachten Sie als Beispiel für eine mögliche Überraschung Folgendes:
unsigned long a = ~0u;
Es wird nicht unbedingt ein Muster mit allen Bits 1 gespeichert a
. Es wird jedoch zuerst ein Muster mit allen Bits 1 in einem erstellt unsigned int
und dann zugewiesen a
. Was passiert, wenn unsigned long
mehr Bits vorhanden sind, ist, dass nicht alle davon 1 sind.
Und betrachten Sie diese, die bei der Komplementdarstellung eines Nicht-Zwei fehlschlägt:
unsigned int a = ~0; // Should have done ~0u !
Der Grund dafür ist, dass ~0
alle Bits invertiert werden müssen. Invertierung dass Ausbeute wird -1
auf eine Ergänzung Maschine zwei (was der Wert ist , die wir brauchen!), Wird aber nicht nachgeben -1
auf eine andere Darstellung. Auf der eigenen Komplementmaschine ergibt sich Null. Auf einer Komplementmaschine wird das Obige a
auf Null initialisiert .
Das, was Sie verstehen sollten, ist, dass es nur um Werte geht - nicht um Bits. Die Variable wird mit einem Wert initialisiert . Wenn Sie im Initialisierer die Bits der für die Initialisierung verwendeten Variablen ändern, wird der Wert gemäß diesen Bits generiert. Der Wert, den Sie benötigen, um a
auf den höchstmöglichen Wert zu initialisieren , ist -1
oder UINT_MAX
. Die zweite hängt von der Art ab a
- Sie müssen ULONG_MAX
für eine verwenden unsigned long
. Der erste hängt jedoch nicht von seinem Typ ab, und es ist eine gute Möglichkeit, den höchsten Wert zu erzielen.
Wir sprechen nicht darüber, ob -1
alle Bits eins sind (es hat nicht immer). Und wir reden nicht darüber, ob ~0
alle Bits eins sind (es hat natürlich).
Wir sprechen jedoch über das Ergebnis der initialisierten flags
Variablen. Und für sie, nur-1
mit jeder Art und Maschine arbeiten.