Zum Inhalt springen

unsigned int negative Zahlen?


Empfohlene Beiträge

Geschrieben

Hallo Leute,

ich bin neu hier. Ich hab mal eine Frage, vll. was jemand bescheid.

Warum funktioniert die Darstellung von negativen Zahlen bei unsigned int?

Beispiel:

unsigned int a= -100;

printf("%d\n",a);

Geht mir irgendwie nicht ein.

Gruß

Geschrieben

Also nicht sicher, aber glaube es ist so:

Wenn du nun "unsigned int a= -1;" schreibst, so tut der compiler erst -1 umformen, das wäre 1111 (vereinfacht mit 4 Bits statt Bytes bei 32-Bit-Systemen) und weist es der Variable a zu.

Du tust jetzt mit "%d" ausgeben, das ist signed und er interpretiert die 1111 als -1

Würdest du "%u" benutzen, wäre es unsigned und er würde 255 ausgeben

Geschrieben
Also nicht sicher, aber glaube es ist so:

Wenn du nun "unsigned int a= -1;" schreibst, so tut der compiler erst -1 umformen, das wäre 1111 (vereinfacht mit 4 Bits statt Bytes bei 32-Bit-Systemen) und weist es der Variable a zu.

Du tust jetzt mit "%d" ausgeben, das ist signed und er interpretiert die 1111 als -1

Würdest du "%u" benutzen, wäre es unsigned und er würde 255 ausgeben

Also der interpretiert die -1 als 2er-Komplement und deswegen ist eine Minuszahl immer unsigned?

@chooter696 das ist bekannt. Es geht ja auch darum, warum er eine Minuszahl darstellt, obwohl unsigned.

Geschrieben

Bin nicht sicher ob du es verstanden hast, also fürn PC ist eine Zahl ja nur 0er und 1er, und C prüft da nicht ob du Mist baust^^ Das sind wohl die 2 Denkfehler: 1. Du erwartest wenn unsigned int, dass man keine negativen Werte übergeben kann und 2. hast du in der printf("%d", i) benutzst, statt printf("%u",i).

wenn du hinschreibst:

unsigned int a = -1

Dann tun andere Compiler vielleicht meckern, weil du ja ne Vorzeichenlose Zahl willst, C hingegen wandelt die -1 erstmal in die Binärform um, (die Länge passt ja für nen int): 1111 und speichert sie in der Variable a

Nun hast du die 1111 drin, wenn du sie als signed ausgibst, bekommst du deine "seltsame" negative Zahl, wenn du sie aber als unsigned ausgibst, bekommste 255

Wie gesagt das Beispiel vereinfacht auf 4 Bits pro Integer.

Vielleicht wird es dir klarer, wenn du dir die Hex-form anschaust:

printf("%x",a);

MfG

Geschrieben
C hingegen wandelt die -1 erstmal in die Binärform um, (die Länge passt ja für nen int): 1111 und speichert sie in der Variable a
Laut Standard ist die Vorgehensweise ein wenig anders: Wenn der Wert nicht in den Wertebereich passt, wird solange der maximal darstellbare Wert + 1 addiert oder subtrahiert, bis er passt.

Bei einem Wert von -100 wird also einmal der maximal mögliche Wert für unsigned int + 1 addiert. Wenn unsigned int 32 Bit groß ist, also 4.294.967.296.

Das Ergebnis ist 4.294.967.196, das ist der Wert, den a nach der Initialisierung hat.

Diese Zahl hat in croonix' Fall dieselbe binäre Repräsentation wie -100 bei (signed) int, weil sein Compiler negative Zahlen als Zweierkomplement speichert. Das muss aber nicht so sein. Der Standard gibt dem Compilerhersteller da drei Möglichkeiten zur Auswahl, Zweierkomplement ist nur eine davon.

Geschrieben (bearbeitet)

Alles klar, wieder was gelernt, naja, habe einfach nur logisch gedacht und es mir so erklärt, wie genau das Standardisiert implementiert ist, wusste ich nicht *gg Fand meine Erklärung ganz logisch, im Prinzip funktioniert sie ja auch immer, es wird ja genau das gemacht, nur das WARUM ist nun klar geworden :-) Und dass es nicht immer so sein muss :-/ Danke :) Sollte übrigens 4.294.967.295 sein bei 32 bit

Bearbeitet von konsti4u

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...