Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

unsigned int negative Zahlen?

Empfohlene Antworten

Veröffentlicht

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ß

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

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.

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.

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

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.

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.