Der Versuch, sowohl die explizite Frage (was ist CHAR_BIT) als auch die implizite Frage (wie funktioniert das) in der ursprünglichen Frage zu beantworten.
Ein Zeichen in C und C ++ stellt die kleinste Speichereinheit dar, die das C-Programm adressieren kann *
CHAR_BIT in C und C ++ repräsentiert die Anzahl der Bits in einem Zeichen. Aufgrund anderer Anforderungen an den Char-Typ muss er immer mindestens 8 betragen. In der Praxis sind es auf allen modernen Allzweckcomputern genau 8, aber einige historische oder spezialisierte Systeme können höhere Werte haben.
Java hat keine Entsprechung zu CHAR_BIT oder sizeof, es ist nicht erforderlich, da alle primitiven Typen in Java eine feste Größe haben und die interne Struktur von Objekten für den Programmierer undurchsichtig ist. Wenn Sie diesen Code nach Java übersetzen, können Sie einfach "sizeof (int) * CHAR_BIT - 1" durch den festen Wert 31 ersetzen.
In diesem speziellen Code wird es verwendet, um die Anzahl der Bits in einem int zu berechnen. Beachten Sie, dass bei dieser Berechnung davon ausgegangen wird, dass der Typ int keine Füllbits enthält.
Angenommen, Ihr Compiler wählt die Vorzeichenverlängerung bei Bitverschiebungen vorzeichenbehafteter Zahlen und nimmt an, dass Ihr System die 2s-Komplementdarstellung für negative Zahlen verwendet, bedeutet dies, dass "MASK" für einen positiven oder Nullwert 0 und für einen negativen Wert -1 ist.
Um eine Zweierkomplementzahl zu negieren, müssen wir eine bitweise nicht ausführen und dann eine hinzufügen. Ebenso können wir einen subtrahieren und ihn dann bitweise negieren.
Wiederum unter der Annahme, dass die Zweierkomplementdarstellung -1 durch alle Einsen dargestellt wird, ist exklusiv oder mit -1 gleichbedeutend mit einer bitweisen Negation.
Wenn also v Null ist, bleibt die Zahl allein, wenn v eins ist, wird sie negiert.
Beachten Sie, dass der signierte Überlauf in C und C ++ ein undefiniertes Verhalten ist. Die Verwendung dieser ABS-Implementierung für den negativsten Wert führt also zu undefiniertem Verhalten. Dies kann durch Hinzufügen von Casts behoben werden, sodass die letzte Zeile des Programms in int ohne Vorzeichen ausgewertet wird.
* Dies entspricht normalerweise, aber nicht unbedingt der kleinsten Speichereinheit, die die Hardware adressieren kann. Eine Implementierung kann möglicherweise mehrere Einheiten des hardwareadressierbaren Speichers zu einer Einheit des programmadressierbaren Speichers kombinieren oder eine Einheit des hardwareadressierbaren Speichers in mehrere Einheiten des programmadressierbaren Speichers aufteilen.