Die Berechnung und Verwendung maximale Wert von uint32_t
Ich weiß, dass UINT32_MAX
existiert, aber ich habe nicht in der Lage, es zu benutzen. Ich habe versucht printf("%d\n", UINT32_MAX);
und es ausgedruckt -1
. Mit %ld
statt %d
stellte mich mit dem Fehler, dass UINT32_MAX
ist vom Typ unsigned int und muss %d
zu drucken.
Bitte helfen, was ich idealerweise wollen, ist ein makro/enum, hält den maximalen Wert von word_t
was ist ein definierter Typ von mir und das ist derzeit uint32_t
.
Ich hoffe, dass ich klar gemacht was ich will, wenn nicht, fühlen Sie sich bitte frei zu Fragen.
BEARBEITEN
Ich habe vergessen zu sagen, was ich eigentlich versuche zu tun. All dies wird verwendet, um ein array von Ganzzahlen, die alle auf Ihren maximalen Wert, weil das Integer-array ist eigentlich eine bitmap, setzt alle bits auf 1.
-1
. Der Typ ist egal (solange es nicht signiert), die Darstellung von Ganzzahlen mit Vorzeichen, die auf die Implementierung egal ist, und Sie brauchen nicht, um herauszufinden, den Namen des Makros für die korrekte max-Wert (das macht es einfacher zu handhaben, mit typedefs, die möglicherweise in Zukunft ändern).Jessop: Ist das nur zufällige Verhalten oder können Sie sich wirklich auf ihn verlassen?
es garantiert durch den C-standard. Signed-unsigned-Wandlung ist 6.3.1.3/2, und die Darstellung von vorzeichenlosen int-Typen ist 6.2.6.2/1 (obwohl man eigentlich nicht die Sorge um die speicherdarstellung, die Sie nur Sorge, dass
-1
umgewandelt in unsigned durch "hinzufügen einer mehr als der maximale Wert, der dargestellt werden kann, in den neuen Typ", und damit -1
konvertiert jeden Datentyp ohne Vorzeichen ist UTYPE_MAX).Ich weiß, es mag sinnlos sein, zu reden, eine "richtige" Art und Weise... aber nicht ~0, besser zu sein als -1 ist... ich meine, ~0 ist, was Sie eigentlich möchten, -1 gibt nur ~0, als ein side-effect of addition/Subtraktion.
InformationsquelleAutor orlp | 2011-03-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Portable Möglichkeit zum drucken eines
uintN_t
- Objekt zu casten, um eineuintmax_t
und verwenden Sie diej
Länge Modifikator mit deru
umwandlungsspezifikator:Den
j
bedeutet, dass das argument ist entweder eineintmax_t
oder eineuintmax_t
; dieu
bedeutet, dass es nicht signiert ist, so ist es eineuintmax_t
.Oder Sie können die format-strings definiert in
<inttypes.h>
(n diesem Fall würden Sie verwendenPRIu32
):Können Sie nicht einfach
%u
denn es ist nicht garantiert, dassint
vertreten ist, von mindestens 32 bits (es muss nur dargestellt werden, indem mindestens 16 bit).j
Formatbezeichner bedeuten?Es gibt
PRIu32
iminttypes.h
, für den Allgemeinen Fall, wo die format-string definiert wird, in dem gleichen Quellcode wie dieprintf
- Anweisung. Wenn der format-string an anderer Stelle definiert ist, die möglicherweise nicht kompatibel sein, dann ist es nicht gut.Vielen Dank, ist eigentlich egal, obwohl die Verwendung dieses nicht dem Druck, aber diese Antwort hat mich verstanden, was das Problem war. Akzeptiert.
Interessant; ich wusste nicht, diese waren dort!
Ich erwähne Sie als jemanden, der nie gestört werden, um tatsächlich die Dinge. Andere als Debuggen (in diesem Fall Sie wissen, Umsetzung),
printf
ist der UI-Programmierung. Ich Tue das nicht-UIs C 😉InformationsquelleAutor James McNellis
Begegnet Ihnen Ihr spezifisches problem, weil
%d
ist eine unterschriebene formatter.Gibt es eine Reihe von Möglichkeiten, es zu beheben (zwei wurden bereits vorgeschlagen), aber die wirklich richtige Weg ist, verwenden Sie die format-Spezifizierer definiert in
<inttypes.h>
:InformationsquelleAutor Stephen Canon
%d
ist für Ganzzahlen mit Vorzeichen. Verwenden%u
.EDIT: Ignoriert diese Antwort und verwenden Sie James ' s, das ist mehr komplett.
int
ist dargestellt durch 16 bits?Naja, ich würde Ihre Antwort dann 🙂
InformationsquelleAutor Pascal Cuoq
Wenn Sie die Einstellung ein array von unsigned int auf die max Werte, die Sie es tun könnten via memset:
memset(array, 0xFF, sizeof(unsigned int) * arraysize);
uint32_t
.Es füllt den block im Speicher byte für byte mit 0xFF. 4 bytes pro int * arraysize.
Vorausgesetzt, dass
CHAR_BIT == 8
, dies ist das richtige füruint32_t
(wie in der Frage), weiluint32_t
ist garantiert nicht zu haben, padding bits. Es ist technisch nicht tragbar fürunsigned int
, da das ist erlaubt den padding-bits, und wenn ja, könnte dies erstellen Sie eine trap-Darstellung. Wir wissen aber auch aus der Frage, die auf die Umsetzung der Fragesteller mit, die beiden Typen sind ja eh der gleiche. Also +1 bis Zähler eine ungerechtfertigte -1.0xFF
ist bezogen aufuint32_t
, davon 8-bit-bytes. Mit 16 bit Byte wäre dies falsch, so besser zu nutzen-1
als0xff
.Der einzige Weg
uint32_t
vorhanden sein können, wennCHAR_BIT
ist mit 8, 16 oder 32. Die Annahme, würde gehen Weg, wenn Sie ersetzen Sie einfach0xFF
mit-1
. 🙂InformationsquelleAutor nullforce