tutorials.de Buch-Aktion 05/2012
Like Tree1Danke
  • 1 Beitrag von deepthroat
ERLEDIGT
JA
ANTWORTEN
7
ZUGRIFFE
304
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Cyraid Cyraid ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    55
    Hallo zusammen,

    eine Frage zum &-Operator beschäftigt mich:
    Der Operator & ist ja die Bitweise And-Verknüpfung. Verknüpfe ich zwei Integer Variablen mit &, so werden die internen Bits der beiden Variablen jeweils And-verknüpft.
    Wie sieht es mit boolschen Variablen aus? Werden boolsche Variablen korrekt mit & und | Operator verknüpft, so als würde man den Vergleichsoperator && und || verwenden?

    Allgemein: Ist eine boolsche Variable in C++ als 1-Bit intern gespeichert oder durch mehrere Bit, da evtl. eine Mindestgröße an Bit für Variablen o.ä. besteht?

    Schöne Grüße, Cyraid
     

  2. #2
    CPoly CPoly ist offline Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.445
    Ich hab mit c/c++ nichts am Hut, aber mit dem g++ compiler bekomme ich folgende Ergebnisse, welche deine Annahme bestätigen zu scheinen.

    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    #include <stdio.h>
     
    int main()
    {
        printf("%i\n", true*5);//5
        printf("%i\n", true+5);//6
        printf("%i\n", true*false);//0
        printf("%i\n", false*5);//0
        printf("%i\n", false+5);//5
        printf("%i\n", true & 11);//1
        printf("%i\n", true & 10);//0
        printf("%i\n", true | 6);//7
        return 0;
    }

    Man kann also mit booleschen Variablen rechnen, wie mit Integern. Ob es jetzt 1 Bit hat oder nicht, kann ich nicht sicher sagen, aber was sollte man mit den verbleibenden 7 Bit anfangen? Die Grundeinheit sind nunmal Byte und ich glaube nicht, dass man auf ein einzelnes Bit im Speicher zeigen kann (hat keine Eigene Adresse, nur Bytes).

    Zitat Zitat von Cyraid Beitrag anzeigen
    Werden boolsche Variablen korrekt mit & und | Operator verknüpft, so als würde man den Vergleichsoperator && und || verwenden?
    Hm, also um die Bitoperation zu machen, wird es in eine Zahl konvertiert und ist damit kein bool mehr. Aber da alles, was ungleich 0 ist true ist, stimmt es doch wieder mit den Ergebnissen von && und || überein.
    Geändert von CPoly (14.06.10 um 18:38 Uhr)
     

  3. #3
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Ein Byte ist laut Definition die kleinste adressierbare Einheit eines Computers. Jeder Datentyp belegt mindestens 1 Byte.

    Ein Byte sind aber nicht unbedingt 8 Bit!

    Es gibt eine implizite Konvertierung / Cast von bool zu int. Egal wie ein bool intern gespeichert wird, wenn man einen Integeroperator auf ihn anwendet, wird true zu 1 und false zu 0 gewandelt.

    Um das nochmal klar zu stellen: es gibt keinen bool operator& (bool, bool). Es wird int operator& (int, int) aufgerufen.

    Wie dein Compiler die boolschen Werte true und false intern speichert, kannst du z.B. so herausfinden:
    Code cpp:
    1
    2
    3
    4
    5
    
    bool t = true;
    bool f = false;
     
    cout << hex << (int)*reinterpret_cast<char*>(&t) << endl;
    cout << hex << (int)*reinterpret_cast<char*>(&f) << endl;
    Gruß
    Geändert von deepthroat (15.06.10 um 10:10 Uhr)
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  4. #4
    Cyraid Cyraid ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    55
    @deepthroat: Danke für die ausführliche Antwort.

    Folgendes Beispiel:
    Code :
    1
    
    bool_var1 &= bool_var2;

    Wenn ich dich richtig verstanden habe, werden hier zunächst bool_var1 und bool_var2 in integer Werte umgewandelt, dann mit dem (integer) Operator & verknüpft und danach findet wieder ein implizieter cast des Ergebnisses statt, um in bool_var1 das Ergebnis zu speichern.
    Bei einem cast von integer in bool (für die Zuweisung an bool_var1) wird (so nehme ich an), alles != 0 in true und 0 in false gewandelt. Wo kann man nachlesen, was genau der implizite cast macht?
    Unter http://www.cplusplus.com/ konnte ich dazu leider nichts finden. Auch nicht über den & Operator an sich.
    Wahrscheinlich habe ich aber einfach nur falsch gesucht ?

    Demnach würde das obige Beispiel äquivalent sein zur Schreibweise:
    Code :
    1
    
    bool_var1 = bool_var1 && boolvar_2;

    ABER: Ist die 1.Variante auch ein guter Programmierstil oder sollte man hier die 2. Variante vorziehen, um mögliche falsche casts zu vermeiden ?

    Schöne Grüße, Cyraid
     

  5. #5
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Zitat Zitat von Cyraid Beitrag anzeigen
    Folgendes Beispiel:
    Code :
    1
    
    bool_var1 &= bool_var2;

    Wenn ich dich richtig verstanden habe, werden hier zunächst bool_var1 und bool_var2 in integer Werte umgewandelt, dann mit dem (integer) Operator & verknüpft und danach findet wieder ein implizieter cast des Ergebnisses statt, um in bool_var1 das Ergebnis zu speichern.
    Ja.
    Zitat Zitat von Cyraid Beitrag anzeigen
    Bei einem cast von integer in bool (für die Zuweisung an bool_var1) wird (so nehme ich an), alles != 0 in true und 0 in false gewandelt.
    Ja. C++ soll ja kompatibel sein zu C90 und C89.
    Zitat Zitat von Cyraid Beitrag anzeigen
    Wo kann man nachlesen, was genau der implizite cast macht?
    Also der implizite Cast macht erstmal nichts anderes als ein expliziter Cast auch. Ganz genau kann man soetwas im C++ Standard ISO 14882 nachlesen. Es kursiert irgendwo auch ein kostenloser Entwurf.
    Zitat Zitat von Cyraid Beitrag anzeigen
    Demnach würde das obige Beispiel äquivalent sein zur Schreibweise:
    Code :
    1
    
    bool_var1 = bool_var1 && boolvar_2;

    ABER: Ist die 1.Variante auch ein guter Programmierstil oder sollte man hier die 2. Variante vorziehen, um mögliche falsche casts zu vermeiden ?
    Ich denke die 2. Variante ist vorzuziehen. Man sollte es vermeiden obskure und/oder mehrdeutige Sprachmerkmale zu benutzen wo nicht jeder auf den ersten Blick sieht was dort eigentlich gemacht wird bzw. wo man erst schauen muss ob das auf diese Weise überhaupt vom Sprachstandard abgedeckt wird.

    Gruß
    Cyraid bedankt sich. 
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  6. #6
    Cyraid Cyraid ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    55
    @deepthroat: Super, vielen Dank !
     

  7. #7
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    Zitat Zitat von deepthroat Beitrag anzeigen
    Ich denke die 2. Variante ist vorzuziehen. Man sollte es vermeiden obskure und/oder mehrdeutige Sprachmerkmale zu benutzen wo nicht jeder auf den ersten Blick sieht was dort eigentlich gemacht wird bzw. wo man erst schauen muss ob das auf diese Weise überhaupt vom Sprachstandard abgedeckt wird.
    Wir haben damals auch gelernt dass man nicht mehr als einen Effekt pro Zeile haben soll. In Anbetracht der Situation dass da diverse Casts noch stattfinden wäre das sicher auch gegen diesen Merksatz, wenn man den &-Operator auf bool-Werte anwendet.
     

  8. #8
    Cyraid Cyraid ist offline Mitglied Silber
    Registriert seit
    May 2006
    Beiträge
    55
    Leider gibt es in C++ jedoch nicht die verkürzte Zuweisung &&= für Vergleichsoperatoren wie &&. Daher kam ich überhaupt auf die Idee es mit &= zu versuchen. Aufgrund der vielen casts ist diese Variante für mich jedoch nun keine Alternative mehr. Der Code wird unnötig unlesbarer.

    Schöne Grüße, Cyraid
     

Ähnliche Themen

  1. Frage zum bitweisen Vergleich ('&'-Operator)
    Von vfl_freak im Forum C/C++
    Antworten: 20
    Letzter Beitrag: 19.10.10, 14:55
  2. Antworten: 3
    Letzter Beitrag: 21.11.09, 15:36
  3. VB 08 / Operator Mid
    Von Xebino im Forum Visual Basic 6.0
    Antworten: 1
    Letzter Beitrag: 14.10.09, 09:23
  4. Frage zum new Operator
    Von OnlyFoo im Forum Javascript & Ajax
    Antworten: 2
    Letzter Beitrag: 03.09.07, 23:20
  5. [c++] << und >> Operator
    Von FireFlow im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 26.12.04, 11:44