Forum: PC-Programmierung Große Boolesche True?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Boole (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert
Es gibt diesbezüglich keinen Standard, der für alle Programmiersprachen 
gilt.

von Stefan ⛄ F. (stefanus)


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

von Dr. Sommer (Gast)


Bewertung
0 lesenswert
nicht 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. (stefanus)


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

von S. R. (svenska)


Bewertung
0 lesenswert
nicht 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. (achs)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Interessant, es gibt immer noch was zu lernen.

von S. R. (svenska)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Warum sollte ein boolean 8 Bit brauchen?

von Rolf M. (rmagnus)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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. (achs)


Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.