Sinn und Unsinn von Bool
-
OK, ich weiß nicht ob das hier das richtige Forum dafür ist. Ich dachte mir, dass die Assembler Programmierer hier mehr zu meiner Frage wissen, da die ja näher an der Hardware sind, als die ganzen Problem- oder Objektorientierten Programmierer.
Eigentlich ist ja der Typ bool ein Typ der nur TRUE oder FALSE darstellen kann (also 1 und 0). Mal jetzt ganz vom riesen Vorteil abgesehen, dass sich mit ihm natürlich so schöne C++ Abfragen wie
bool bDownloading; . . . if(!bDownloading)/*tu was*/; //das ist auch sprachlich schöner "Not Be Downloading"
formen kann, und ich nicht den Umweg à la
int nDownloading; . . . if(nDownloading == 0)/*tu was*/;
gehen muss, möchte ich jetzt eher auf die Speicherfrage eingehen. Mich würde es interessieren WIE Bool-Werte gespeichert werden?
Mir ist bekannt, dass der RAM Speicher nur Byteweise adressiert wird (alles andere macht auch herzlich wenig Sinn). Wenn ich jetzt also eine Bool-Variable erstelle, in welcher Sprache auch immer (ich gehe davon aus, dass die ganzen Compiler auf dem Markt ähnliche Wege zur Speicherung von solchen Werten gehen), dann muss doch zwangsweise ein ganzes Byte dazu hergenommen werden. Das heißt doch, das die restlichen 7 Bits ungenutzt bleiben?Und wenn die restlichen 7 Bits wirklich ungenutzt bleiben, bringt das irgendeinen anderen Vorteil, außer dem, den ich schon genannt hatte? Ich weiß ja nicht, vielleicht gehen Prozessoren ja mit solchen Werten anders um? Oder vielleicht sogar der Arbeitsspeicher selber?
Diese Frage ist nur so Just For Fun, wenn keiner Antwortet kann ich trotzdem in Ruhe weiter Programmieren. Aber mich würde es halt zum Hintergrund einfach intressieren.
Gruß
Markus Seidl
PS: Ich habe so ziemlich keine Ahnung von den FPU's und sonstigen Registern von Prozessoren, bedenkt das bitte bei Eurer Antwort ;). Ich Progge nur Visual C++.
-
Es ist tatsächlich so das ein komplettes Byte genutzt wird.
In C-Kompilern werden sogar 4 Bytes genutzt, da der BOOL-Wert eigentlich ein Int-Wert ist der abgespeichert wird.
Es gibt zwar eigentlich nur die beiden Aussagen TRUE und FALSE, Jedoch steckt mehr dahinter.
Der Wert 0 ist immer als FALSE anzusehen. ALLE anderen Wert UNGLEICH 0 sind als TRUE anzusehen.
-
du kannst auch wenn du ne int X hast schreiben:
if (X) ....
um einfach zu überprüfen ob X grösser 0 ist.
bei assemblern selbst gibts es keinen typ bool (wahrscheinlich, weil man angst hat den asm codern diesen typ anzudrehen, da es für diese keinen sinn macht ... bei den dummen c++ codern geht das. die merken sowas nicht)
du kannst auch wenn du die bytes sparen willst eine variable anlegen und einzelne bits prüfen. somit hast du zb wenn du einen byte reserviert hast gleich 8 variablen vom typ bool. wenn du jetzt zB schreibts:
if (x &...
dann überprüfst du ob das 4te bit gesetzt ist...
-
Angren Aldaron schrieb:
OMal jetzt ganz vom riesen Vorteil abgesehen, dass sich mit ihm natürlich so schöne C++ Abfragen wie
bool bDownloading; . . . if(!bDownloading)/*tu was*/; //das ist auch sprachlich schöner "Not Be Downloading"
formen kann, und ich nicht den Umweg à la
int nDownloading; . . . if(nDownloading == 0)/*tu was*/;
gehen muss,
Du kannst auch if(!nDownloading)
schreiben.
-
Ergo, BOOL macht so gut wie überhaupt keinen Sinn, sondern es ließe sich auch alles, wie ihr schon geschrieben habt, mit INTEGER lösen. Selbst die nette Abfrage. Was nach natürlich das bDownloading ("Be Downloading") angeht, könnte man ja mal aus der Namenskonvention rausspringen.
Gut, ich bedanke mich für euere Antworten, damit lässt sich jetzt sogar mein Quellcode vereinfachen.
Gruß
Markus Seidl
PS:
Original geschrieben von wasiliy
bei assemblern selbst gibts es keinen typ bool (wahrscheinlich, weil man angst hat den asm codern diesen typ anzudrehen, da es für diese keinen sinn macht ... bei den dummen c++ codern geht das. die merken sowas nicht)
Naja, DU musst es schon sehr nötig haben, wenn du deine eigene Dummheit nicht bemerkst ;).