AGB  ·  Datenschutz  ·  Impressum  







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

Verständnisfrage Boolean <-> Zahl

Ein Thema von Der schöne Günther · begonnen am 16. Dez 2013 · letzter Beitrag vom 17. Dez 2013
Antwort Antwort
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Verständnisfrage Boolean <-> Zahl

  Alt 16. Dez 2013, 18:49
Ich weiß nicht, ob man noch alte Steintafeln ausgräbt auf denen das schon so geregelt war, aber ich kenne Boolean als Ganzzahl immer mit 0 für False und 1 für True .

Auch Delphis Boolean.ToInteger() gibt 0 oder 1 aus. Warum in aller Welt gibt BoolToStr(..) eigentlich '0' und '-1' aus? Weder ist das konsistent, noch kann ich mir irgendeinen Grund denken.

Delphi-Quellcode:
function BoolToStr(B: Boolean; UseBoolStrs: Boolean = False): string;
const
  cSimpleBoolStrs: array [boolean] of String = ('0', '-1');
begin
  if UseBoolStrs then
  begin
    VerifyBoolStrArray;
    if B then
      Result := TrueBoolStrs[0]
    else
      Result := FalseBoolStrs[0];
  end
  else
    Result := cSimpleBoolStrs[B];
end;
  Mit Zitat antworten Zitat
Benutzerbild von Meflin
Meflin

Registriert seit: 21. Aug 2003
4.856 Beiträge
 
#2

AW: Verständnisfrage Boolean <-> Zahl

  Alt 16. Dez 2013, 18:51
... vielleicht, weil eine andere (gängige) Definition von Booleans ist, dass 0 = false und alles andere true ist?
Leo S.
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

AW: Verständnisfrage Boolean <-> Zahl

  Alt 16. Dez 2013, 19:00
weil eine andere (gängige) Definition von Booleans ist, dass 0 = false und alles andere true ist
Frei aus der Hüfte geschossen, um zu erklären, wie man auf -1 kommen könnte:
Wenn man -1 als vorzeichenbehafteten Integer darstellt, sind alle Bitstellen auf 1 gesetzt. Was auch eine übliche Darstellung für true ist.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.156 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Verständnisfrage Boolean <-> Zahl

  Alt 16. Dez 2013, 19:01
Richtig! Diese Füchse! Für einen signed Datentyp ist -1 ja 0xFF..FF und 0 ist 0x00.00. Macht also doch durchaus Sinn.

Trotzdem: Das hätte ich bei einer ToInteger() -Methode verstanden, nicht bei einem ToString() !
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Verständnisfrage Boolean <-> Zahl

  Alt 16. Dez 2013, 20:01
Jupp, also False = 0 und True <> 0.

Wobei die "Konstanten" da etwas anders sind, denn diese können nunmal nur einen Wert enthalten.
In Delphi ist die Konstante True als 1 ($01 = Byte) deklariert, während es in den C-Sprachen meistens als -1 ($FFFFFFFF) deklariert ist.

In C vermutlich, damit es mit dem AND sicher klappt, wenn man den "Boolean" als Integer interpretiert.


Wieso allerdings BoolToStr grade -1 nutzt, hab ich noch nie verstanden,
aber im Notfall kannst du einfach TrueBoolStrs anpassen und dort als Erstes die 1 einfügen.

IntToStr(Ord(B))
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.685 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Verständnisfrage Boolean <-> Zahl

  Alt 17. Dez 2013, 01:03
Der Hintergrund ist übrigens einfach der NOT-Operator. Binär gesehen dreht der ja einfach nur jedes Bit um. Und Prozessoren können einzelne Bits nicht so toll (bzw. überhaupt nicht) benutzen. Also hat man für einen Boolean meist mindestens ein Byte zu benutzen. Man kam daher zu dem Entschluss, dass "false" = 0 sein sollte, also 0b00000000. Dreht man nun jedes Bit davon durch NOT um, erhält man 0b11111111. Jetzt kommt es auf ein Mal darauf an, als was ich den Wert interpretiere: Byte oder SmallInt (signed byte)! "true" ist daher, im Falle von Byte als benutzte Datenstruktur, entweder -1 oder 255. Sicher ist nur, das "false"=0.

Delphi macht es hier ein wenig anders, weil man sich wohl dachte: "Jou. Das ist seltsam." Und man ging daher, und legte FALSE=0, und TRUE=1 fest, und machte den NOT-Operator so intelligent, dass er zwischen Binär-NOT und logischem NOT zu unterscheiden weiss. Man ist ja immerhin in einer typsicheren Sprache unterwegs, da kann man das hervorragend so tun. Wenn jedoch irgendwelche WinAPI-(C)-Gelöte beteiligt sind, wird klammheimlich - und das ist auch, warum es Types wie LongBool usw. gibt - konvertiert.

Letztlich kann man sich daher im Grunde nur auf eines wirklich verlassen: FALSE=0. Alles andere ist TRUE, egal was es nun genau ist.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Verständnisfrage Boolean <-> Zahl

  Alt 17. Dez 2013, 01:37
Genau deswegen macht man auch nicht if B = True then , denn hier wird nicht nach booleschen, sondern nach ordinalen Regeln verglichen.

Und ja, man kann daher wirklich dem Typ Boolean mehrere Werte zuweisen.

Delphi-Quellcode:
var
  B: Boolean;

B := Boolean(2);



if B then
  ShowMessage('Ja');

if not B then
  ShowMessage('Nein');

if B then
  ShowMessage('Ja')
else
  ShowMessage('Nein');

if B = True then
  ShowMessage('Ja')
else if B = False then
  ShowMessage('Nein')
else
  ShowMessage('Vielleicht'); // :D
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: Verständnisfrage Boolean <-> Zahl

  Alt 17. Dez 2013, 02:02
Delphi-Quellcode:
var
// ..
if B = True then
  ShowMessage('Ja')
else if B = False then
  ShowMessage('Nein')
else
  ShowMessage('Vielleicht'); // :D
Und schon haben wir Fuzzylogik xD
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Antwort Antwort


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 02:43 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