Diese Frage wurde schon einmal gestellt, aber ich bin immer noch verwirrt.
ich weiß das
unsigned int a = -1;
wäre UINT_MAX. Aber das liegt nicht daran, dass alle Bits auf -1 gesetzt sind. C11 sagt
Wenn der neue Typ vorzeichenlos ist, wird der Wert konvertiert, indem wiederholt eins mehr als der maximale Wert, der im neuen Typ dargestellt werden kann, addiert oder subtrahiert wird, bis der Wert im Bereich des neuen Typs liegt
Also sagen wir mal UINT_MAX ist 100 (ich weiß, es sollte größer als 2 ^ 16-1 sein, aber ignorieren wir das vorerst)
unsigned int a = -1; // will be
unsigned int a = -1 + UINT_MAX + 1; // 100 = UINT_MAX
Standard sagt nur UINT_MAX >= 2^16-1. Aber steht irgendwo, dass es 2^n-1 sein sollte?
Ist die Antwort in C++ auch anders?
Ich denke, dass der Standard die genaue Bitdarstellung von Werten meistens unspezifiziert (oder plattformabhängig) lässt. Es gibt (waren) einige wirklich seltsame Architekturen da draußen.
– Richard Critten
17. Februar 2017 um 12:04 Uhr
2501
In C muss der Maximalwert für eine Ganzzahl ohne Vorzeichen die Form haben1: 2N – 1.
Also alle Wert Bits des Werts UINT_MAX werden auf 1 gesetzt. Es kann sein Polsterung Bits, deren Werte nicht spezifiziert sind.
1 (Zitiert aus: ISO/IEC 9899:201x 6.2.6.2 Integer-Typen 1)
Für andere vorzeichenlose Integer-Typen als unsigned char müssen die Bits der Objektdarstellung in zwei Gruppen unterteilt werden: Wertbits und Füllbits (es muss keines der letzteren geben). Wenn es gibt N Wertbits, jedes Bit soll eine andere Potenz von 2 zwischen 1 und 2 darstellenN−1 sodass Objekte dieses Typs Werte von 0 bis 2 darstellen könnenN−1 unter Verwendung einer reinen Binärdarstellung; dies soll als Wertdarstellung bekannt sein. Die Werte aller Füllbits sind nicht angegeben.
Hm. Ich denke, Sie können keinen C-Compiler für einen ternären Computer schreiben.
– Markieren
17. Februar 2017 um 21:27 Uhr
Also du könntees wäre einfach scheiße 😛
– MickLH
17. Februar 2017 um 22:09 Uhr
@Mark: Sie müssen nur 8-Bit-Basis-2-Byte-für-Byte-Überläufe emulieren. Also im Grunde: Die resultierende Binärdatei müsste in einem Base-2-Emulator laufen.
– Muhende Ente
18. Februar 2017 um 1:11 Uhr
Nein, nicht ganz.
Ein vorzeichenloser Typ kann bestehen aus Wert Bits und Füllbits.
Sie haben Recht, dass die Wertbits für den Maximalwert immer auf 1 gesetzt werden, aber die spezifischen Werte der Füllbits bleiben der Implementierung überlassen. Das bedeutet also, dass UINT_MAX a sein muss Mersenne-Zahl. Andere Anforderungen besagen, dass es nicht weniger als 65535 sein darf.
C und C++ sind in dieser Hinsicht gleichwertig.
Aber das erfordert immer noch, dass UINT_MAX die Form 2^n – 1 haben muss, für einige n >= 16.
– Martin Bonner unterstützt Monika
17. Februar 2017 um 12:17 Uhr
In der Tat: dh eine Mersenne-Zahl (nicht unbedingt eine Primzahl), größer oder gleich 65535.
– Bathseba
17. Februar 2017 um 12:17 Uhr
Ich kann im C ++ 14-Standard nichts über grundlegende Typen mit Füllbits finden. Der einzige Gedanke, den ich sehen kann, ist der Verweis auf den C-Standard in [basic.fundamental] Es muss C 5.2.4.2.1 respektieren, der die Abschnitte zu den Grenzen enthält.
– NathanOliver
17. Februar 2017 um 12:48 Uhr
Kleiner Spitzfindigkeit: Es kann gut sein, den Bezug zu den Mersenne-Zahlen so klarzustellen der Term ist normalerweise für 2^p-1 reserviert mit p prim. Obwohl p wird oft mit Notationsmissbrauch auf jede positive ganze Zahl verallgemeinert.
– Margaret Bloom
17. Februar 2017 um 17:58 Uhr
Sie haben Recht, wenn Sie sagen, dass nach der Definition von Konvertierungen -1, das in unsigned int konvertiert wird, garantiert UINT_MAX ist. Es hat nichts mit irgendwelchen Bitmustern zu tun. Wenn es eine Implementierung gäbe, bei der UINT_MAX 100 war, dann wäre -1, konvertiert in unsigned int, 100.
Es gibt Gründe, warum UINT_MAX nicht 100 sein kann: Eins, weil es ≥ 2^16-1 sein muss, aber das würde UINT_MAX = 1.000.000 zulassen. Zweitens, weil unsigned int eine binäre Darstellung mit einer festen Anzahl n von Wertbits haben muss, also UINT_MAX = 2^n – 1.
Es ist möglich, dass INT_MAX = 2^31 – 1 und UINT_MAX = 2^31 – 1 (nicht 2^32 – 1, wie es normalerweise ist). In diesem Fall wären bei -1 32 Bits gesetzt; -1 Umwandlung in unsigned int wäre 2^31 – 1 und hätte nur 31 Bits gesetzt.
Winziger Nitpick: -1 in 1+31-Bit signed int hat 32 Bit gesetzt wenn die Implementierung das Zweierkomplement verwendetwas praktisch alle Maschinen seit Mitte der 80er für ganze Zahlen tun, aber 6.2.6.2p2 erlaubt Einerkomplement oder Vorzeichen und Betrag, die 31 Bits bzw. 2 Bits haben würden.
– dave_thompson_085
17. Februar 2017 um 16:46 Uhr
@ dave_thompson_085: Ein System mit 32-Bit-Zweierkomplement-Ganzzahl mit Vorzeichen hätte mit ziemlicher Sicherheit auch eine 32-Bit-Ganzzahl ohne Vorzeichen. So ziemlich der einzige Grund, warum eine nicht erfundene Implementierung eine hätte unsigned Typ mit weniger möglichen Werten als der entsprechende vorzeichenbehaftete Typ wäre, dass die Hardware auf eine Form der vorzeichenbehafteten Arithmetik beschränkt war, die keine 2ⁿ unterschiedlichen Werte aufnehmen konnte.
– Superkatze
17. Februar 2017 um 19:33 Uhr
13830700cookie-checkSind bei UINT_MAX alle Bits auf 1 gesetzt?yes
Ich denke, dass der Standard die genaue Bitdarstellung von Werten meistens unspezifiziert (oder plattformabhängig) lässt. Es gibt (waren) einige wirklich seltsame Architekturen da draußen.
– Richard Critten
17. Februar 2017 um 12:04 Uhr