Schreckliche Antworten in Hülle und Fülle
Ozgur Ozcitak
Wenn Sie von signiert zu nicht signiert (und umgekehrt) wechseln, ändert sich die interne Darstellung der Nummer nicht. Was sich ändert, ist, wie der Compiler das Vorzeichenbit interpretiert.
Das ist völlig falsch.
Mats Fredriksson
Wenn eine vorzeichenlose und eine vorzeichenbehaftete Variable hinzugefügt werden (oder eine beliebige binäre Operation), werden beide implizit in vorzeichenlose Variablen konvertiert, was in diesem Fall zu einem großen Ergebnis führen würde.
Das ist auch falsch. Vorzeichenlose Ints können zu Ints heraufgestuft werden, wenn sie aufgrund von Füllbits im vorzeichenlosen Typ die gleiche Genauigkeit haben.
smh
Ihre Additionsoperation bewirkt, dass das int in ein vorzeichenloses int konvertiert wird.
Falsch. Vielleicht tut es und vielleicht tut es nicht.
Die Konvertierung von vorzeichenlosem int in signiertes int ist implementierungsabhängig. (Aber es funktioniert wahrscheinlich so, wie Sie es heutzutage auf den meisten Plattformen erwarten.)
Falsch. Es ist entweder ein undefiniertes Verhalten, wenn es einen Überlauf verursacht, oder der Wert bleibt erhalten.
Anonym
Der Wert von i wird in ...
Falsch. Hängt von der Genauigkeit eines int relativ zu einem vorzeichenlosen int ab.
Taylor Price
Wie bereits beantwortet, können Sie problemlos zwischen signiert und nicht signiert wechseln.
Falsch. Der Versuch, einen Wert außerhalb des Bereichs einer vorzeichenbehafteten Ganzzahl zu speichern, führt zu undefiniertem Verhalten.
Jetzt kann ich endlich die Frage beantworten.
Sollte die Genauigkeit von int gleich int ohne Vorzeichen sein, wird u zu einem vorzeichenbehafteten int heraufgestuft und Sie erhalten den Wert -4444 aus dem Ausdruck (u + i). Wenn u und ich andere Werte haben, kann es zu einem Überlauf und undefiniertem Verhalten kommen, aber mit diesen genauen Zahlen erhalten Sie -4444 [1]. . Dieser Wert hat den Typ int. Sie versuchen jedoch, diesen Wert in einem vorzeichenlosen Int zu speichern, sodass er dann in ein vorzeichenloses Int umgewandelt wird und der Wert, den das Ergebnis ergibt, (UINT_MAX + 1) - 4444 lautet.
Sollte die Genauigkeit des vorzeichenlosen int größer sein als die eines int, wird das vorzeichenbehaftete int zu einem vorzeichenlosen int heraufgestuft, was den Wert (UINT_MAX + 1) - 5678 ergibt, der zu dem anderen vorzeichenlosen int 1234 addiert wird. Sollten u und ich haben Bei anderen Werten, bei denen der Ausdruck außerhalb des Bereichs {0..UINT_MAX} liegt, wird der Wert (UINT_MAX + 1) entweder addiert oder subtrahiert, bis das Ergebnis innerhalb des Bereichs {0..UINT_MAX) liegt und kein undefiniertes Verhalten auftritt .
Was ist Präzision?
Ganzzahlen haben Füllbits, Vorzeichenbits und Wertbits. Ganzzahlen ohne Vorzeichen haben offensichtlich kein Vorzeichenbit. Es ist weiterhin garantiert, dass vorzeichenloses Zeichen keine Füllbits enthält. Die Anzahl der Wertebits einer Ganzzahl gibt an, wie genau sie ist.
[Fallstricke]
Die Makrogröße des Makros allein kann nicht verwendet werden, um die Genauigkeit einer Ganzzahl zu bestimmen, wenn Füllbits vorhanden sind. Und die Größe eines Bytes muss kein Oktett (acht Bits) sein, wie in C99 definiert.
[1] Der Überlauf kann an einem von zwei Punkten auftreten. Entweder vor dem Hinzufügen (während der Promotion) - wenn Sie ein vorzeichenloses int haben, das zu groß ist, um in ein int zu passen. Der Überlauf kann auch nach dem Hinzufügen auftreten, selbst wenn das vorzeichenlose int im Bereich eines int lag. Nach dem Hinzufügen kann das Ergebnis dennoch überlaufen.