croonix Geschrieben 13. Dezember 2009 Geschrieben 13. Dezember 2009 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ß Zitieren
konsti4u Geschrieben 13. Dezember 2009 Geschrieben 13. Dezember 2009 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 Zitieren
chooter696 Geschrieben 13. Dezember 2009 Geschrieben 13. Dezember 2009 unsigned bedeutet vorzeichenlos. Vieleicht jetzt ein Bissen Verständlicher. bei unsigned werte fällt der Negative Bereich weg und verdoppelt den Positiven um sich selbst. Zitieren
croonix Geschrieben 13. Dezember 2009 Autor Geschrieben 13. Dezember 2009 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. Zitieren
konsti4u Geschrieben 13. Dezember 2009 Geschrieben 13. Dezember 2009 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 Zitieren
Klotzkopp Geschrieben 13. Dezember 2009 Geschrieben 13. Dezember 2009 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 aLaut 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. Zitieren
konsti4u Geschrieben 13. Dezember 2009 Geschrieben 13. Dezember 2009 (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 13. Dezember 2009 von konsti4u Zitieren
Klotzkopp Geschrieben 13. Dezember 2009 Geschrieben 13. Dezember 2009 Sollte übrigens 4.294.967.295 sein bei 32 bitNein, 4.294.967.296 ist schon richtig. Es wird der maximal darstellbare Wert +1 addiert. Zitieren
Empfohlene Beiträge
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.