Programmieren - alles kontrollieren 4.932 Themen, 20.605 Beiträge

Programmierung in C

Kevin4 / 3 Antworten / Baumansicht Nickles

(jd) Mich interessiert, wie in C ein negativer Wert als Integer dargestellt wird, bei 16 Bit. Das 1. Zeichen ist ein Vorzeichen, ich bin davon ausgegangen, dass ich die Zahl ausrechne, z.B. 7 ist binär 111 umwandle und dann noch das vorzeichen von 0 auf 1 (steht für negativ) ändere. Jetzt hab ich im Selbststudium das Buch von H. Herold und W. Unger "C GESAMTWERK" gelesen. Hier wird erst die Zahl 7 binär dargestellt, dann wir invertiert. Durch meine Methode komm ich auf: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 <== -7 im Buch steht: 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 <== -7 Kann mir einer einen Grund erklären und warum es dann überhaupt ein Vorzeichenbit gibt. Bin um jede Antwort dankbar.

bei Antwort benachrichtigen
T-Rex Kevin4

„Programmierung in C“

Optionen

Hi,

ob es sich um ein signed oder unsigned int handelt, sieht man an der BitKombination nicht.

Angenommen Du hast ein signed int:
Wertebereich von -32768 bis 32767.
Wenn du das ganze jetzt einem unsigned int zuweist, reicht der Wertebereich von 0 bis 65535.
Die Bits sind immer noch die gleichen. Nur das jetzt ein anderer Wert rauskommt.

Dieses Bit heißt zwar Vorzeichenbit (signed int), hat aber nicht viel damit zu tun. Ist es gesetzt, dann weiß derjenige, der es ausliest, dass die Zahl negativ ist.
Bei unsigned int weiß er dagegen, dass die Zahl oberhalb von 32767 liegt.

Bei den signed ints kann man ganz einfach in den negativen Bereich fallen: Du weist der Variable den Wert 32766 zu. Dann addierst Du drei mal die eins dazu, läßt Dir jedesmal den Wert ausgeben und voilá: Falsches Vorzeichen!

Das mit dem invertieren geht halt am schnellsten, um eine negative Zahl darzustellen.

 GrüßeT-Rex 
bei Antwort benachrichtigen
Andreas42 Kevin4

„Programmierung in C“

Optionen

Hi Kevin!

Diese im Buch beschriebene Art um negative Integer zu kodieren, ist keine Eigenart von C (oder C++). Man macht das in fast allen Sprachen so.

Wenn man mit deiner Methode zwei Variablen addieren will, dann müsste man zuerst feststellen, ob eine der Werte negativ ist und dann den absoluten Wert der negativen Variable von der positiven Subtrahieren (bei gleichem Vorzeichen wird addiert).

Kann man machen, muss man aber nicht. ;-)

Besser ist natürlich eine Methode, die bei einer Addition oder Subtraktion automatisch das Vorzeichen berücksichtigt. Schneller ist das dann auch und Speed ist ja schon beim Programmieren immer schon die halbe Miete gewesen... :)

Nimmt man die Werte aus dem Buch (+7, -7) und addiert sie, muss 0 rauskommen. Und in der Tat kommt das auch raus (ich nehme mal nur 5 Bits für die Zahlendarstellung):

00111 + 11001 = 00000

Die negative Zahl bekommt man, indem man die positiove von Null abzieht (wie auch sonst...):

00000 - 00111 = 11001

Wenn das mit dem Überlauf unklar ist, dann stell dir vor es steht noch ein 6tes Bit vor der "Null":

(1)00000 - (0)00111 = (0)11001

Übrigends kann man das von Null Abziehen auch durch negieren der Bits und addition von 00001 durchführen.

OK, bleibt noch das Vorzeichenbit. Das ist eigentlich nur dazu da, damit man (z.B. für Bildschirmausgaben) schnell feststellen kann, ob ein Wert positiov oder negativ ist. Zum Rechnern (bei normalen Additionen und subtraktionen) wird es nicht benötigt.

Ich hoffe das hilft dir weiter.

Bis den
Andreas

Ich sehe die Stimmungslage meiner Mitmenschen. Daher bleibt nur eine letzte Forderung: Weltuntergang jetzt sofort!
bei Antwort benachrichtigen
Kevin4

Nachtrag zu: „Programmierung in C“

Optionen

Thx,
danke Ihr beiden, habs kapiert.
Habs zwar schon mal gehört nur mir war der Sinn noch nicht ganz klar.
-54 & +26 = 10 !!

Also nachmal danke.
Kev.

bei Antwort benachrichtigen