Sind bei UINT_MAX alle Bits auf 1 gesetzt?

Lesezeit: 4 Minuten

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

Benutzer-Avatar
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

1383070cookie-checkSind bei UINT_MAX alle Bits auf 1 gesetzt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy