AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Warum ist ein Boolean so groß?

Ein Thema von Eichhoernchen · begonnen am 25. Okt 2005 · letzter Beitrag vom 26. Okt 2005
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#11

Re: Warum ist ein Boolean so groß?

  Alt 26. Okt 2005, 05:30
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 -.-''
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#12

Re: Warum ist ein Boolean so groß?

  Alt 26. Okt 2005, 07:00
@himitsu: Das ist ja blasphemisch, was Du mit den Booleans anstellst (inc/dec) 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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#13

Re: Warum ist ein Boolean so groß?

  Alt 26. Okt 2005, 07:15
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.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#14

Re: Warum ist ein Boolean so groß?

  Alt 26. Okt 2005, 07:28
Zitat von Robert Marquardt:
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.
Und genau deshalb ergibt Ord(Boolean(True)) immer 1, obwohl intern Borland auch hier mit -1 als Wert für True arbeitet.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#15

Re: Warum ist ein Boolean so groß?

  Alt 26. Okt 2005, 09:09
Zitat von Muetze1:
Und genau deshalb ergibt Ord(Boolean(True)) immer 1
Das ist ein unsinniger Ausdruck. True ist bereits vom Typ Boolean. Eine Umtypung ist nicht noetig.

Mal genauer:
Delphi-Quellcode:
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;
Das ergibt "1 -1 -1 -1".
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.152 Beiträge
 
Delphi 12 Athens
 
#16

Re: Warum ist ein Boolean so groß?

  Alt 26. Okt 2005, 12:53
Zitat von alzaimar:
@himitsu: Das ist ja blasphemisch, was Du mit den Booleans anstellst (inc/dec) 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.
Also da brauchst du/ihr wohl keine Bedenken haben ... kennt ihr z.B. die Klasse TCanvas?, dort wird inern sowas gemacht (um das Canvas zu sperren), wenn ich mich nicht irre (hab hier kein Delphi und daheim ist's im Moment auch nicht installiert, also kann ich da nicht nochmal nachsehen, aber ich glaub das mal gesehn zu haben ^^)

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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#17

Re: Warum ist ein Boolean so groß?

  Alt 26. Okt 2005, 13:02
Zitat von Robert Marquardt:
Zitat von Muetze1:
Und genau deshalb ergibt Ord(Boolean(True)) immer 1
Das ist ein unsinniger Ausdruck. True ist bereits vom Typ Boolean. Eine Umtypung ist nicht noetig.
Das war kein Quellcode, dann hätte ich ihn entsprechend gekennzeichnet - das war Pseudocode. Ich wollte mit dem Boolean() den Typ nochmal explizit hervorheben auf den ich mich mit meiner Aussage beziehe.

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).
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#18

Re: Warum ist ein Boolean so groß?

  Alt 26. Okt 2005, 13:08
Zitat von himitsu:
Also da brauchst du/ihr wohl keine Bedenken haben ... kennt ihr z.B. die Klasse TCanvas?, dort wird inern sowas gemacht (um das Canvas zu sperren), wenn ich mich nicht irre (hab hier kein Delphi und daheim ist's im Moment auch nicht installiert, also kann ich da nicht nochmal nachsehen, aber ich glaub das mal gesehn zu haben ^^)
Wenn du LockCount meinst: ist ein Integer .

Richtig lustig wird dann so etwas:
Delphi-Quellcode:
var
  b: Boolean;
begin
  b := Boolean(2);

  if b then
    Writeln('1');

  if b = true then
    Writeln('2');

  Readln;
end.
Ich denke, ihr könnte euch die Ausgabe vorstellen .
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#19

Re: Warum ist ein Boolean so groß?

  Alt 26. Okt 2005, 13:13
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).
  Mit Zitat antworten Zitat
SMO

Registriert seit: 20. Jul 2005
178 Beiträge
 
Delphi XE6 Professional
 
#20

Re: Warum ist ein Boolean so groß?

  Alt 26. Okt 2005, 17:20
Zitat von Olli:
Gegenfrage:
Warum ist das menschliche Gehirn zu einem hohen Prozentsatz ungenutzt?
Ist doch redundant. Laßt es uns rausschnippeln.
Meinst du das ernst? Ich hoffe nicht (sorry, mein Ironiedetektor ist gerade defekt ). Das ist ein doofer alter Mythos. Wir benutzen 100% unseres Gehirns, wenn auch nicht gleichzeitig (CPUs sind ja auch nicht immer zu 100% benutzt/ausgelastet ). Siehe z.B. hier (Deutsch) oder hier (Englisch).

Zitat:
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).
Ich glaube nicht, dass es hier ein "Problem" gibt, ich finde diese Diskussion interessant. Oxmyx' Aussage über die Ausrichtung war inkorrekt, was mich dazu angestoßen hat hier teilzunehmen. Ebenso wie mich deine kühne Aussage dazu verleitet hat, nochmal zu antworten.


@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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:26 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