Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Integer Theorie (https://www.delphipraxis.net/9727-integer-theorie.html)

nailor 2. Okt 2003 14:48


Integer Theorie
 
Hi!

Ich habe eine Frage dazu, wie Delphi Intgers speichert. Es sind ja 32 bits. Ich will jetzt irgendwoher wissen, wie das Funktioniert. Arbeitet Delphi mit Offset oder mit Flags, um negative Zahlen darzustellen. Welche Bitmuster entsprechen -1, 0, 1, -2147483648, 2147483647???

Link würde reichen, oder Ihr

sakura 2. Okt 2003 14:56

Re: Integer Theorie
 
Delphi verlässt sich da ganz auf die Prozessorstruktur. Dieser nutzt das höchste Bit (31) für das Vorzeichen. Die Bits 00-30 sind für den Wert.

...:cat:...

Christian Seehase 2. Okt 2003 15:06

Re: Integer Theorie
 
Moin Nailor,

wenn Du die Bitmuster eines Integers haben willst kannst Du Dir das mit Windows Bordmitteln anschauen:
Der Rechner (CALC.EXE) kann auch auf Binärdarstellung umgestellt werden.

Das Vorzeichen wird immer durch das höchst Bit angegeben. Ist das gesetzt, wird die Zahl als negativ angesehen.
Das ist aber Konvention für Integer. Bei Cardinal wird dieses Bit als "ganz normales" Bit angesehen, da Cardinals ja nur 0 oder positiv sind.

Tonic1024 2. Okt 2003 15:29

Re: Integer Theorie
 
Moin Nailor...

Zitat:

Zitat von sakura
Delphi verlässt sich da ganz auf die Prozessorstruktur. Dieser nutzt das höchste Bit (31) für das Vorzeichen. Die Bits 00-30 sind für den Wert.

Ist ja auch logisch... 32 Bit währen ja DEZ_4294967296 also BIN_100000000000000000000000000000000.

Wenn nun, wie sakura sagt, nur 31 Bit Werte enthalten ist DEZ_2147483648 - was ja auch hinkommt, da die DEZ_0 ein positiver (?!?) Wert ist und IntMax demnach DEZ_2147483647. damit bleibt für die negativen Zahlen ein Wert mehr übrig (weil es -0 (also minus Null) nun mal nicht gibt) also DEZ_-2147483648. Das hasst du ja auch schon geschrieben und dir damit deine frage eigentlich schon selbst beantwortet. 8)

Dummerweise ist mir entfallen ob die 1 oder die 0 im MSB (also Bit 31) für positiv steht... sonst könnt ich dir auch den Binärwert sagen. :oops:

[EDIT] Da oben stehts ja... 1 ist positiv... Wer lesen kann ist klar im Vorteil :wall: [/EDIT]

bis denne...

Sanchez 2. Okt 2003 15:37

Re: Integer Theorie
 
Habe soeben einen Bug in Calc.exe gefunden.

Versucht mal -5 dez nach Binär umzuwandeln.

5 ergibt 101, passt
-5 ergibt 11111111111111111111111111111111111111111111111111 11111111111011

:bounce2:

negaH 2. Okt 2003 15:37

Re: Integer Theorie
 
IntToHEX(-2147483648) = $80000000, somit Bit 31 = 1 wenn negative Zahl.

Gruß Hagen

sakura 2. Okt 2003 15:41

Re: Integer Theorie
 
Zitat:

Zitat von Sanchez0815
Habe soeben einen Bug in Calc.exe gefunden.

Versucht mal -5 dez nach Binär umzuwandeln.

5 ergibt 101, passt
-5 ergibt 11111111111111111111111111111111111111111111111111 11111111111011

:bounce2:

Nicht wirklich, daß ist die 64-Bit Darstellung, da ist halt "erst" Bit 63 für die negativ-Maskierung da ;-)

...:cat:...

Jens Schumann 2. Okt 2003 15:43

Re: Integer Theorie
 
Hallo,
Zitat:

Zitat von Sanchez0815
Habe soeben einen Bug in Calc.exe gefunden.

zu früh gefreut. Das ist kein Bug negative Zahlen werden im Zweier Komplement dargestellt.
Ob es jetzt das Zweier Komplement +1 o. das Zweier Komplement -1 ist habe ich vergessen (zu lange her) Durch die Darstellung im Zweier Komplement läßt sich eine Subtraktion als Addition durch führen.

negaH 2. Okt 2003 15:43

Re: Integer Theorie
 
Zitat:

Habe soeben einen Bug in Calc.exe gefunden.

Versucht mal -5 dez nach Binär umzuwandeln.

5 ergibt 101, passt
-5 ergibt 11111111111111111111111111111111111111111111111111 11111111111011
Das ist kein Bug, sondern die Komplementärdarstellung einer negative Zahl die im Bereich -2^63 <= 0 < +2^63 liegt.

Durch diese Darstellung muß die CPU das Vorzeichen nicht extra berechnen.
Zb. -5 + +6 = +1

$FFFFFFFB = -5
+ $00000006 = +6
= $00000001 = +1

Somit ist die Begründung, warum im negative Bereich eine Zahl mehr dargestellt werden kann, einfach weil nur dadurch die Rechnungen mit Komplementären Zahlen möglich ist. Es hat also nichts damit zu tun das es kein +0 oder -0 geben kann.

Gruß hagen

Sanchez 2. Okt 2003 15:45

Re: Integer Theorie
 
Rechnen kann ers aber nicht in beide Richtungen

Wenn ich jetzt
5 dez nach binär umwandle
invertiere
wieder nach dezimal
bekomme ich 18446744073709551611

Sollte da nicht -5 rauskommen???

sakura 2. Okt 2003 15:49

Re: Integer Theorie
 
Das liegt einfach daran, das der Windows-Taschenrechner im Binärmode unabhängig von Vorzeichen arbeitet. Kurz, ja man kann es als Bug sehen, andererseits, wer will schon mit negativen Zahlen im Binärmode arbeiten :mrgreen:

...:cat:...

negaH 2. Okt 2003 15:51

Re: Integer Theorie
 
Zitat:

Rechnen kann ers aber nicht in beide Richtungen

Wenn ich jetzt
5 dez nach binär umwandle
invertiere
wieder nach dezimal
bekomme ich 18446744073709551611

Sollte da nicht -5 rauskommen???
Das ist korrekt, der Rechner macht einen "Fehler" ? oder ist es so gewollt ?

Wäre schon logisch wenn Bill Gates 6 Euro auf'm Konto hat. Dann hebt er 11 Euro ab und hat 5 Euro Schulden. Nun ist Billy sehr trickreich, geht zu Bank, öffnet den Schlepptop und zerrt den Rechner raus. Er rechnet der Bank vor das 5 Euro Schulden, also -5 in Binär umgewandelt, dann zurück nach Dezimal ein Guthaben von 18446744073709551611 Euro ergibt !!

Gruß Hagen

Luckie 2. Okt 2003 15:56

Re: Integer Theorie
 
Hat schon jemand den USB-Anschluß an einem Geldautomaten gefunden? :gruebel:

Christian Seehase 2. Okt 2003 16:04

Re: Integer Theorie
 
Moin Luckie,

aber denk dran: Die laufen mit OS/2. ;-)

Luckie 2. Okt 2003 16:07

Re: Integer Theorie
 
Stimmt, nach dem ich mal abgehoben hatte, hat sich mir eine BlueScreen präsentieret. :mrgreen:

(PS: Jetzt wird es offtopic.)

Tonic1024 6. Okt 2003 08:32

Re: Integer Theorie
 
Moin...

Zitat:

Zitat von Sanchez0815
Habe soeben einen Bug in Calc.exe gefunden.

Versucht mal -5 dez nach Binär umzuwandeln.

5 ergibt 101, passt
-5 ergibt 11111111111111111111111111111111111111111111111111 11111111111011

Gut, dass es sich nicht um einen Bug handelt hatten wir ja schon geklährt. Ich will nur noch einmal etwas dazu sagen, weil ich finde, dass alles was hier gesagt wurde zwar technisch richtig aber immernoch recht viel fachchinesisch ist.

Es stimmt schon, was Hagen sagte. Es gibt kein +0 und kein -0. Man kann es sich nur so schön merken mit der Null... Nennen wir es eine Eselsbrücke.

Also:
11111111111111111111111111111111111111111111111111 11111111111011 ist eine negative Zahl - zu erkennen an der 1 im MSB (Most significant Bit - also das erste von links). Wenn man die Zahl invertiert erhält man folgendes:
00000000000000000000000000000000000000000000000000 00000000000100 also DEZ_4. da wir aber noch für die Nulldifferenz "-0"(auch wenns sie eigentlich nicht gibt) einen Wert abziehen müssen, wird aus +4 dann -5.

Dieser Weg ist wie gesagt eine Elselsbrücke, aber funktioniert immer... und geht fast schneller als mit calc.exe :lol:

bis denne...

Blechwolf 6. Okt 2003 10:37

Re: Integer Theorie
 
Salut,

um auch hier nochmal meinen Senf dazu zugeben.
Wenn ich da richtig informiert bin, so hängt es auch vom Prozessor ab, welches Bit jetzt das Vorzeichen bestimmt. Denn bei den Suns werden die Binärzahlen nämlich nicht wie auf den Windows-Rechner mit dem kleinsten (also 2^0) links sondern mit dem kleinsten Bit Rechts dargestellt.
Insofern ist die Zahl 100 auf einem Win-Rechner = 4, auf einer Sun-Maschine entspricht das aber der 1.
Aber um auf das Vorzeichen zurück zu kommen. Die Aussage mit dem MSB war da schon richtig und allgemein gültig. Nur alles was danach kommt, nämlich mit dem MSb ganz links war eben typisch Windo*s...
Aber wer programmiert schon Delphi auf ner Sun... ;o)

Grüße

Blechwolf

negaH 16. Okt 2003 14:04

Re: Integer Theorie
 
Zitat:

Wenn ich da richtig informiert bin, so hängt es auch vom Prozessor ab, welches Bit jetzt das Vorzeichen bestimmt. Denn bei den Suns werden die Binärzahlen nämlich nicht wie auf den Windows-Rechner mit dem kleinsten (also 2^0) links sondern mit dem kleinsten Bit Rechts dargestellt.
Diese Annahme ist absolut falsch. Ein 32Bit Wert in einem 32Bit Register wird auf jeder CPU in Big Endian gespeichert. Erst wenn diese Register in den Speicher verlagert werden kommt es zur "Endian Umwandlung". Dabei wird im eigentliche Sinne überhaupt nicht konvertiert sondern die Art und Weise wie die Register in welcher Reihenfolge auf die Datenleitungen gelegt werden entscheidet dies.
Das Signum Bit ist immer MSB. Alles andere wäre rechentechnisch idiotisch.

Zitat:

Insofern ist die Zahl 100 auf einem Win-Rechner = 4, auf einer Sun-Maschine entspricht das aber der 1.
Also das solltest du mal genauer erklären !

Gruß Hagen


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:50 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz