Anzahl der bits in einem Daten-Typ
Ich habe zwei Aufgaben, die für eine Zuordnung, eine Rückkehr der Anzahl der bits im Typ int auf jeder Maschine. Ich dachte, ich würde schreiben, dass meine Funktion in etwa so:
int CountIntBitsF() {
int x = sizeof(int) / 8;
return x;
}
Sieht das richtig?
Der zweite Teil ist die Rückgabe die Anzahl von bits von Daten mit einem makro, und das makro entnommen werden kann, Grenzen.h. Ich schaute nach oben begrenzt.h auf meinem Rechner, und auch http://www.opengroup.org/onlinepubs/007908799/xsh/limits.h.html, aber ich glaube nicht, dass ich wirklich verstehen, wie jede dieser zurückkehren würde, die Anzahl der bits in jedem Datentyp. Irgendwelche Gedanken? Danke.
Verwandte Frage: c - Anzahl der bits in basic-Datentyp.
InformationsquelleAutor Crystal | 2010-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist
*
, nicht/
.Als für den zweiten Teil finden Sie unter "Numerische Grenzen" Abschnitt.
InformationsquelleAutor Ignacio Vazquez-Abrams
Die grundlegende Einheit der Speicherung ist ein char. Es ist nicht immer 8 bit breit. CHAR_BIT ist definiert in Grenzen.h und hat die Anzahl der bits in einem char.
InformationsquelleAutor Justin Smith
Wenn Sie möchten, die Anzahl der verwendeten bits zur Speicherung eines int im Speicher Justin ' s Antwort
sizeof(int)*CHAR_BIT
. Wenn Sie wissen wollen, die Anzahl von bits in dem Wert slebetman Antwort.Obwohl man die bits in einem INT, sollten Sie wahrscheinlich verwenden INT_MAX eher als UINT_MAX. Ich kann mich nicht erinnern, ob C99 eigentlich garantiert, dass
int
undunsigned int
sind die gleiche Breite, oder einfach nur, dass Sie die gleiche Speicher Größe. Ich vermute, dass nur die letzteren, da in 6.2.6.2 haben wir ", wenn es M-Wert-bits in der signed-Typ und N in der unsigned-Typ, dann M <= N" nicht "M = N oder M = N-1".In der Praxis, Integrale Typen nicht haben padding-bits in jeder Implementierung, die ich verwendet habe, so dass Sie wahrscheinlich bekommen die gleiche Antwort für alle, +/- 1 für das Vorzeichen-bit.
unsigned
) , verwendet die gleiche Menge an Speicher (einschließlich sign information) und besitzt die gleiche Ausrichtung Anforderungen.Danke. Und der Hinweis "dieselbe Menge Speicherplatz", um nicht zu sagen "gleiche Anzahl von nicht-padding bits".
Warum müssen wir wissen, den Unterschied zwischen einer int im Speicher vs die bits in dem Wert. Die bits in dem Wert mehr wichtig, wenn Sie waren dabei eine Art von hardware-Programmierung, wo Sie gebraucht werden, um die Anzahl der verwendeten bits zur Darstellung bestimmter register oder etwas entlang jenen Linien?
Ja, es gibt viele wichtige Gründe, um sich über die bitwidth einer int. Für eine Sache, es wird bestimmt, wie groß ein Wert gespeichert werden kann (dh, eine signierte 16-bit-int speichern kann -32768..32767, während ein unsigned 16bit int speichern kann 0..65535 und so weiter). Es ist auch wichtig, wenn Sie brauchen, um Daten serialisiert, dh für die Speicherung in einer Datei oder übertragung über das Netzwerk.
InformationsquelleAutor Steve Jessop
In
limits.h
, UINT_MAX ist der maximale Wert für ein Objekt vom Typ unsigned int. Das heißt, es ist ein int mit allen bits auf 1 gesetzt. So, das zählen der Anzahl von bits in einem int:denken Sie vielleicht über Verlagerung unterzeichnet - Werte. Für unsigned-Typen, ist die Verschiebung gut definiert.
Man muss sich erinnern, dass der Quellcode sich in Maschinensprache durch den Compiler, sondern durch die Dokumente angeben.
technisch ist das nicht eine Erweiterung der standard, es ist nur eine Verletzung, und der compiler in diesem Modus ist daher nicht nur ein C-compiler ist ein compiler für eine andere Sprache sehr ähnlich zu C. Ansonsten ist Java eine "Erweiterung" von C-standard, durch das hinzufügen und entfernen von Regeln aus C, bis Sie am Ende mit Java ;-). Eine Erweiterung der C-standard ist, wenn Sie etwas zu nehmen, das wäre nicht legal C, und definieren, was es bedeutet in Ihrer Umsetzung. Es hat keinen Einfluss auf die rechtliche C.
int und unsigned int die gleiche Anzahl von bits". Ich kann nicht finden, dass in der standard, wissen Sie, wo es ist angegeben? Welche Regel muss ich brechen, wenn Sie in meiner Umsetzung sizeof(unsigned int) == 4, UINT_MAX == 0xFFFFFFFF, sizeof(int) == 4, INT_MAX == 0x3FFFFFFF, und int hat eine Polsterung bit für keinen guten Grund, dass ich denke, von anderen als lulz?
InformationsquelleAutor slebetman
Mit g++ -O2 diese Funktion wertet die auf einer inline-Konstante:
Ausgänge:
Generierten X86-32-bit-assember:
---SNIP---
---SNIP---
InformationsquelleAutor Wojciech Migda
Sind Sie sicher, dass Sie möchten, die Anzahl der bits, nicht die Anzahl der bytes? In C, für eine gegebene Art
T
finden Sie die Anzahl der bytes, die es dauert, durch die Verwendung dersizeof
Betreiber. Die Anzahl der bits in einem byte istCHAR_BIT
, die in der Regel 8, aber können unterschiedlich sein.So, in einem gegebenen Typ
T
die Anzahl der bits in einem Objekt vom TypT
ist:Beachten Sie, dass, außer für
unsigned char
Art, alle möglichen Kombinationen vonnbits
bits, die oben können nicht stellen Sie einen gültigen Wert vom TypT
.Für den zweiten Teil, beachten Sie, dass Sie anwenden können
sizeof
- operator auf ein Objekt als auch als Typ. In anderen Worten, gegeben ein TypT
und ein Objektx
solcher Art:Finden Sie die Größe des T durch
sizeof(T)
, und die Größe derx
durchsizeof x
. Die Klammern sind optional, wennsizeof
wird für ein Objekt.Angesichts der oben genannten Informationen, sollten Sie in der Lage sein, um die Antwort auf Ihre zweite Frage. Wieder Fragen wenn Sie noch Fragen haben.
InformationsquelleAutor Alok Singhal