Was ist CHAR_BIT?

Zitieren des Codes zum Berechnen des ganzzahligen Absolutwerts (abs) ohne Verzweigung von http://graphics.stanford.edu/~seander/bithacks.html :

int v; // we want to find the absolute value of v unsigned int r; // the result goes here int const mask = v >> sizeof(int) * CHAR_BIT - 1; r = (v + mask) ^ mask; 

Patentierte Variante:

 r = (v ^ mask) - mask; 

Was ist CHAR_BIT und wie benutzt man es?

Sie sollten sich darüber im Klaren sein, dass dieser Code vom implementierungsdefinierten Verhalten des Bitshift-Befehls für signierte Typen abhängt. gcc verspricht immer das vernünftige Verhalten (Vorzeichen-Bit-Erweiterung), aber ISO C erlaubt der Implementierung, die oberen Bits auf Null zu setzen.

Eine Möglichkeit, dieses Problem zu umgehen:

 #ifdef HAVE_SIGN_EXTENDING_BITSHIFT int const mask = v >> sizeof(int) * CHAR_BIT - 1; #else int const mask = -((unsigned)v >> sizeof(int) * CHAR_BIT - 1); #endif 

Ihr Makefile oder config.h usw. kann HAVE_SIGN_EXTENDING_BITSHIFT zur Build-Zeit abhängig von Ihrer Plattform definieren.

CHAR_BIT ist die Anzahl der Bits in char . Heutzutage benutzen fast alle Architekturen 8 Bits pro Byte, aber das ist nicht immer der Fall. Einige ältere Maschinen hatten früher ein 7-Bit-Byte.

Es kann in

Versuchen, 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 ++ stellt die Anzahl der Bits in einem Zeichen dar. Aufgrund anderer Anforderungen an den Typ char muss es immer mindestens 8 sein. In der Praxis ist es bei allen modernen Universalcomputern genau 8, aber einige historische oder spezielle Systeme können höhere Werte haben.

Java hat kein Äquivalent zu CHAR_BIT oder sizeof, es ist nicht notwendig, 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 in 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 diese Berechnung voraussetzt, dass der Int-Typ keine Füllbits enthält.

Angenommen, Ihr Compiler wählt Extend für Bitverschiebungen signierter Zahlen und unter der Annahme, dass Ihr System 2s Komplementdarstellung für negative Zahlen verwendet, bedeutet dies, dass “MASK” für einen positiven oder Nullwert 0 und -1 für einen negativen Wert ist.

Um eine Zweierkomplementzahl zu negieren, müssen wir ein bitweises nicht ausführen und dann eins hinzufügen. Gleichermaßen können wir eins subtrahieren und dann bitweise negieren.

Wiederum wird angenommen, dass die Zweierkomplementdarstellung -1 durch alle Einsen repräsentiert wird, so dass Exklusiv oder mit -1 der bitweisen Negation entspricht.

Wenn also v null ist, wird die Zahl alleine gelassen, wenn v eins ist, wird es negiert.

Zu beachten ist, dass der überzeichnete Überlauf in C und C ++ nicht definiert ist. Die Verwendung dieser ABS-Implementierung auf dem negativsten Wert führt zu undefiniertem Verhalten. Dies kann durch Hinzufügen von Umwandlungen behoben werden, so dass die letzte Zeile des Programms in unsigned int ausgewertet wird.

* Das ist normalerweise, aber nicht nesacerally das gleiche wie die kleinste Speichereinheit, die die Hardware adressieren kann. Eine Implementierung kann möglicherweise mehrere Einheiten von Hardware-adressierbarem Speicher in eine Einheit von programmadressierbarem Speicher kombinieren oder eine Einheit von Hardware-adressierbarem Speicher in mehrere Einheiten von programmadressierbarem Speicher aufteilen.