![]() |
Re: Warum ist ein Boolean so groß?
Ach, daher haben die C-Header, worauf Delphi ja anscheinend aufgebaut ist, Integer/Cardinal, obwohl das Win32-SDK was von BOOL(LongBool) sagt.
Und ich dachte schon die haben sich verlesen -.-'' |
Re: Warum ist ein Boolean so groß?
@himitsu: Das ist ja blasphemisch, was Du mit den Booleans anstellst (inc/dec) :zwinker: Das funktioniert? Cool, ehrlich. Aber ich würde das nicht in meinen Code schreiben, weil es durchaus mal sein kann, das Borland das nicht mehr unterstützt. Und dann suchst Du dir einen Wolf.
|
Re: Warum ist ein Boolean so groß?
Ein Boolean ist ein ordinaler Datentyp mit Succ(False) = True und Pred(True) = False sowie Ord(False) = 0 und Ord(True) = 1. Das ist Pascal.
Inc() und Dec() auf einem Boolean sind wirklich ein wenig dubios. Auf einem ByteBool, WordBool oder LongBool hingegen nicht, da dies Zahlentypen sind. |
Re: Warum ist ein Boolean so groß?
Zitat:
|
Re: Warum ist ein Boolean so groß?
Zitat:
Mal genauer:
Delphi-Quellcode:
Das ergibt "1 -1 -1 -1".
procedure TForm1.FormCreate(Sender: TObject);
var B: Boolean; BB: ByteBool; WB: WordBool; LB: LongBool; begin B := True; BB := B; WB := B; LB := B; ShowMessageFmt('%d %d %d %d', [Ord(B), Ord(BB), Ord(WB), Ord(LB)]); end; Damit ist klar das ByteBool, WordBool und LongBool vorzeichenbehaftet sind (trotz ihres Namens). Bei der Zuweisung von B wird eine Signextension vorgenommen, obwohl Boolean formal vorzeichenlos ist. Intern wird fuer Boolean True auch definitiv 1 genommen. Aendert man naemlich Ord(B) im oben gezeigten Beispiel in Byte(B), so wird immer noch "1" ausgegeben. Der Grund fuer -1 als True in ByteBool etc ist Visual Basic das mit 0 und -1 in einem Long operiert. |
Re: Warum ist ein Boolean so groß?
Zitat:
Also zumindestens bei ByteBool/WordBool/LongBool, bei Boolean scheint es zwar anders zu sein, aber da es sich dort auch um ein Byte handelt (was sih wohl auch nicht ändern wird), sollte es dort auch so bleiben ... jedenfalls wird ja immer (wenn ordentlich programmiert wurde) auf =0 und <>0 geprüft. |
Re: Warum ist ein Boolean so groß?
Zitat:
Und bei dem Byte() Typecast wird afaik auch trotzdem die Umwandlung wie bei Ord() genommen intern. Ich glaube das Borland das intern so gebastelt hatte (Compiler Magic). |
Re: Warum ist ein Boolean so groß?
Zitat:
Richtig lustig wird dann so etwas:
Delphi-Quellcode:
Ich denke, ihr könnte euch die Ausgabe vorstellen :mrgreen: .
var
b: Boolean; begin b := Boolean(2); if b then Writeln('1'); if b = true then Writeln('2'); Readln; end. |
Re: Warum ist ein Boolean so groß?
Gegenfrage: Warum ist das menschliche Gehirn zu einem hohen Prozentsatz ungenutzt? Ist doch redundant. Laßt es uns rausschnippeln. Also sorry, ich verstehe nicht wo das Problem ist, zumal schon die erste Antwort völlig korrekt war (Tubos). Auch der spätere Einwand, daß je nach Adressierungsmodus des Prozessors auch 32bit oder neuerdings 64bit schneller sein können war völlig korrekt (Oxmyx). |
Re: Warum ist ein Boolean so groß?
Zitat:
![]() ![]() Zitat:
@Khabarakh: Das ist wirklich lustig! Interessanterweise funktioniert dieser "Trick" (Fehler?) nicht mehr bei Byte/Word/LongBool. Der Compiler übersetzt dort "b := ByteBool(2)" direkt zu "b := -1". Aber selbst wenn man b anders auf den Wert 2 zwingt (z.B. "Byte(b) := 2") prüft "b = true" nicht etwa auf =1 oder =-1 sondern korrekt auf <>0. Zusammengefasst also: Mit Boolean wird nur 1 ausgegeben, mit den anderen Bool-Typen 1 und 2. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz