Forum: PC-Programmierung Große Boolesche True?


von Boole (Gast)


Lesenswert?

Hallo,


gibt es einen Standard, der definiert, wie sich eine boolesche Variable 
verhält, wenn sie "überladen" ist?

Ist sie wirklich immer true, wenn sie nicht exakt "0" enthält, oder gibt 
es auch Compiler/Sprachen die wirklich nur auf das niederwertigste Bit 
gucken und ein False zurückgeben, wenn dort =2 bzw. ein gerader Wert 
drin steht?

: Verschoben durch Moderator
von Theor (Gast)


Lesenswert?

Es gibt diesbezüglich keinen Standard, der für alle Programmiersprachen 
gilt.

von Stefan F. (Gast)


Lesenswert?

Ich kenne keine Programmiersprache, für die "alle Zahlen ungleich 0 sind 
true" nicht gilt.

von Dr. Sommer (Gast)


Lesenswert?

Stefan U. schrieb:
> Ich kenne keine Programmiersprache, für die "alle Zahlen ungleich
> 0 sind
> true" nicht gilt.
C++, Java? Da kannst du gar nichts anderes als true/false in eine bool 
Variable schreiben. Wenn du eine Zahl zuweist, wird die nach true bzw. 
false umgewandelt. Wenn man bool wieder in einen Integer umwandelt, 
kommt immer 1/0 heraus. Wie aber true/false jetzt tatsächlich im 
Speicher dargestellt werden, ist plattformspezifisch. Die meisten werden 
aber 1/0 verwenden, und andere Zahlen werden niemals in bool-Variablen 
abgelegt.

Beitrag #5227538 wurde vom Autor gelöscht.
von Stefan F. (Gast)


Lesenswert?

Es geht sicher um solche Konstrukte:
1
i=3;
2
if (i) { ...}

von S. R. (svenska)


Lesenswert?

> gibt es einen Standard, der definiert, wie sich eine boolesche Variable
> verhält, wenn sie "überladen" ist?

Jede Programmiersprache definiert sich boolsche Variablen und damit auch 
deren Verhalten selbst. Mit "überladen" hat das nichts zu tun.

Es gibt Sprachen, in denen ein Boolean genau true oder false ist, z.B. 
C++ oder Java. Da gibt es keine Diskussion.

Es gibt Sprachen, in denen ein Boolean effektiv ein Integer ist, z.B. 
klassisches C. Da gilt üblicherweise "0 = false; alles andere = true". 
Dazu kommen lokale Konventionen (z.B. "TRUE als 1 definiert"), die das 
weiter einschränken können.

Es gibt Sprachen, in denen es keinen Boolean gibt, z.B. die 
Scriptsprache deiner Wahl. Da wird pro Operator oder pro Operation 
definiert, was jetzt ein "true" und was ein "false" ist, wenn das 
sinnvoll ist. Ein leerer String kann z.B. je nach Zusammenhang mal 
"true" (existiert) oder "false" (ist leer) sein.

von A. S. (Gast)


Lesenswert?

Boole schrieb:
> Ist sie wirklich immer true

ich hoffe Du meinst nicht sowas wie
1
if(myBool == true)

Das schlägt für ALLE bis auf einen Wert fehl.

von Anja (Gast)


Lesenswert?

Stefan U. schrieb:
> Ich kenne keine Programmiersprache, für die "alle Zahlen ungleich 0 sind
> true" nicht gilt.

Ich schon:
PL/M -> manche Compiler (PLM51) nehmen alle ungeraden Zahlen als "TRUE"
BASIC -> manche Interpreter verwenden "-1" als TRUE

Gruß Anja

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Stefan U. schrieb:
> Ich kenne keine Programmiersprache, für die "alle Zahlen ungleich 0 sind
> true" nicht gilt.
Einfach jede Programmiersprache, die eine weniger implizite 
Typbehandlung als C hat.
VHDL hat z.B. eine extrem strenge Typisierung. Da ist 0 und false und 
'0' und "0" jeweils etwas komplett anderes und muss erst mal umgewandelt 
werden.

von Rolf H. (b0d0)


Lesenswert?

Stefan U. schrieb:
> Ich kenne keine Programmiersprache, für die "alle Zahlen ungleich 0 sind
> true" nicht gilt.

In Lua ist sogar 0 true :)

von Stefan F. (Gast)


Lesenswert?

Interessant, es gibt immer noch was zu lernen.

von S. R. (svenska)


Lesenswert?

Achim S. schrieb:
> ich hoffe Du meinst nicht sowas wie
>   if(myBool == true)
> Das schlägt für ALLE bis auf einen Wert fehl.

In C ist das so, wenn myBool nicht vom Typ _Bool ist.

Und ja, eine Codebase, mit der ich zu tun habe, beginnt mit "#define 
FALSE (0)" und "#define TRUE (1)" - verwendet das aber auch durchgehend.

von Yalu X. (yalu) (Moderator)


Lesenswert?

Anja schrieb:
> BASIC -> manche Interpreter verwenden "-1" als TRUE

Das sind diejenigen Sprachen, die keinen Bool-Typ kennen und bei denen
die AND, OR, NOT usw. bitweise auf Integerzahlen in Zweierkomplement-
darstellung arbeiten. Wahrer als -1 (alle Bits sind 1) geht es nicht.
Neben vielen Basic-Dialekten gehört auch der Pascal-Dialekt von MikroE
dazu.

Die meisten anderen Pascals und viele weitere Sprachen konvertieren gar
nicht implizit zwischen Bool nach Integer, weil das dort zwei völlig
unterschiedliche und nicht kompatible Datentypen sind.

Konvertiert man in Pascal mit der Ord-Funktion ein Bool (dort Boolean
genannt) nach Integer, erhält man 0 oder 1. In einigen Pascal-Dialekten
kann mit der Boolean-Funktion auch von Integer nach Bool konvertiert
werden, wobei dann jede von 0 verschiedene Zahl als True gewertet wird.

Haskell verhält sich diesbezüglich ähnlich wie Pascal, allerdings sind
bei der Konvertierung von Integer nach Bool mit der Funktion toEnum nur
die Zahlenwerte 0 und 1 erlaubt. Will man eine beliebige von 0
verschiedene Zahl x nach True konvertieren, benutzt man einfach die
Relation x /= 0, was dann für alle numerischen Datentypen, (nicht nur
Integer) funktioniert.

In Python lassen sich alle Datentypen implizit und explizit nach bool
konvertieren. Zahlen mit dem Wert 0, leere Container sowie None ergeben
dabei False, alles andere True, sofern für den jeweilige Datentyp keine
davon abweichende Konvertierung durch den Benutzer definiert wurde.

@Boole:

Wie du an diesen und den vorangegangenen Beispielen erkennen kannst,
variieren die einzelnen Programmiersprachen bei der Realisierung von
Booleschen Datentypen und der Behandlung von Booleschen Ausdrücken sehr
stark.

von Anja (Gast)


Lesenswert?

S. R. schrieb:
> "#define TRUE (1)" - verwendet das aber auch durchgehend.

In "C" müßte es korrekterweise "#define TRUE (!FALSE)" heißen
damit es Implementierungsunabhängig immer funktioniert.

Gruß Anja

von Boole (Gast)


Lesenswert?

...danke für die vielen Antworten, aber anhand Der Reaktionen sehe ich, 
dass die Frage garnicht so 100% klar zu beantworten war und es sich 
lohnt darüber ein paar Gedanken zu verlieren.

...aber:
Sprachen, die nur ein True oder False für eine boolesche Variable 
zulassen, belegen am Ende doch sicherlich ebenfalls mindestens 8 Bit, 
oder nicht?

von Na (Gast)


Lesenswert?

Warum sollte ein boolean 8 Bit brauchen?

von Rolf M. (rmagnus)


Lesenswert?

Anja schrieb:
> S. R. schrieb:
>> "#define TRUE (1)" - verwendet das aber auch durchgehend.
>
> In "C" müßte es korrekterweise "#define TRUE (!FALSE)" heißen
> damit es Implementierungsunabhängig immer funktioniert.

Das sieht man recht häufig, ist aber Unsinn. Ich weiß nicht, warum es 
sich so hartnäckig hält.
Auf jeder Implementierung ist das Ergebnis von (!0) nichts anderes als 
1. Es macht also genau gar keinen Unterschied.

Boole schrieb:
> Sprachen, die nur ein True oder False für eine boolesche Variable
> zulassen, belegen am Ende doch sicherlich ebenfalls mindestens 8 Bit,
> oder nicht?

Ja, typischerweise schon. Was dann allerdings passiert, wenn man da 
"hinterrücks" was eigentlich ungültiges reinschreibt, dürfte kaum in 
einer Sprache wirklich offiziell definiert sein.

Na schrieb:
> Warum sollte ein boolean 8 Bit brauchen?

Weil es kaum Plattformen gibt, auf denen sich was kleineres einzeln 
adressieren lässt.

: Bearbeitet durch User
von Rolf H. (b0d0)


Lesenswert?

Rolf M. schrieb:
> Weil es kaum Plattformen gibt, auf denen sich was kleineres einzeln
> adressieren lässt.

Lässt sich auf manchen CPUs schon (BTST) adressieren, dauert aber 
entweder länger oder ist zumindest nicht schneller. Gibt es in C 
übrigens auch, mit den Bitfeldern: 
http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/015_c_strukturen_013.htm

von S. R. (svenska)


Lesenswert?

Anja schrieb:
> In "C" müßte es korrekterweise "#define TRUE (!FALSE)" heißen
> damit es Implementierungsunabhängig immer funktioniert.

Warum sollte das so sein? Der exakte Wert ist doch ziemlich egal, 
solange TRUE und FALSE verschieden sind.

Boole schrieb:
> Sprachen, die nur ein True oder False für eine boolesche Variable
> zulassen, belegen am Ende doch sicherlich ebenfalls mindestens 8 Bit,
> oder nicht?

Das hängt davon ab, was die Architektur anbietet.
Der AVR kennt z.B. das T-Flag, welches mit bestimmten Befehlen gesetzt 
und gelöscht werden kann. Ein guter Compiler könnte dieses Flag als 1 
Bit-Register für boolsche Variablen betrachten.

Der SDCC zielt auf Architekturen mit extrem wenigen Allzweckregistern ab 
(Akku-Architekturen) und nutzt tatsächlich für manche Targets die Flags 
als Register. Seit C99 kennt C schließlich einen echten boolschen 
Datentyp (_Bool).

Und dann gibt es noch Architekturen mit bitadressierbarem Speicher.

von Rolf M. (rmagnus)


Lesenswert?

Rolf H. schrieb:
> Rolf M. schrieb:
>> Weil es kaum Plattformen gibt, auf denen sich was kleineres einzeln
>> adressieren lässt.
>
> Lässt sich auf manchen CPUs schon (BTST) adressieren, dauert aber
> entweder länger oder ist zumindest nicht schneller. Gibt es in C
> übrigens auch, mit den Bitfeldern:
> http://openbook.rheinwerk-verlag.de/c_von_a_bis_z/015_c_strukturen_013.htm

Elemente von Bitfeldern lassen sich nicht einzeln adressieren - sprich: 
Man kann keine Zeiger darauf definieren.
Und in C gibt es keine Datentypen, die kleiner sind als char. Einzelne 
Elemente eines Bitfeldes können kleiner sein, aber das ganze Bitfeld hat 
dann wieder eine Größe, die ein Vielfaches der Größe von char ist. Man 
kann also nicht z.B. eine einzelne Variable definieren, die 1 Bit breit 
ist. Man könnte nur eine Variable definieren, die ein Byte breit ist und 
dann nur ein Bit davon nutzen, und das ist dann genau das, was bei bool 
oft gemacht wird.

von A. S. (Gast)


Lesenswert?

Rolf M. schrieb:
>> In "C" müßte es korrekterweise "#define TRUE (!FALSE)" heißen
>> damit es Implementierungsunabhängig immer funktioniert.
>
> Das sieht man recht häufig, ist aber Unsinn. Ich weiß nicht, warum es
> sich so hartnäckig hält.
> Auf jeder Implementierung ist das Ergebnis von (!0) nichts anderes als
> 1. Es macht also genau gar keinen Unterschied.

Nur zur Untermauerung der c-faq-Eintrag 
:http://c-faq.com/bool/bool2.html

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.