2010-10-19 8 views
5

In VB6 ergibt das Erzwingen von True zu einer Ganzzahl den Wert -1.Warum ist -1 das Ergebnis von True auf eine ganze Zahl in VB6?

Warum ist das so? Was ist der Grund dafür?

In den meisten anderen Programmiersprachen (C/C++, Java, Perl, Python usw.) wird true zu 1, wenn es in eine ganze Zahl umgewandelt wird. In der Booleschen Algebra wird der Wert 1 verwendet, um wahr/ein zu repräsentieren. Warum macht VB6 das anders?

Ich sehe eine gewisse elegante Symmetrie in der Tatsache, dass ein Bitwise-nicht von -1 (True) 0 (False) ergibt, und umgekehrt (wegen -1 Darstellung ist alles 1s in two's complement), aber Ich kann mir keinen praktischen Nutzen dieser Identität vorstellen.

Ich frage nur aus Neugier, übrigens - das war etwas, das mir seltsam vorkam, als ich VB6 zum ersten Mal lernte, und ich frage mich seitdem.

Antwort

7

Sie kam ganz in der Nähe der Grund ... Eric Lippert reveals the horrible, horrible truth:

Was ist hier los ist, dass VBScript nicht logisch ist. VBScript ist bitweise. Alle so genannten logischen Operatoren arbeiten mit Zahlen, nicht mit booleschen Werten! Nicht, und, Oder, XOr, Eqv und Imp konvertieren alle ihre Argumente in Vier-Byte-Ganzzahlen, führen die logische Operation für jedes Paar von Bits in den Ganzzahlen durch und geben das Ergebnis zurück. Wenn True -1 ist und False 0 ist, dann funktioniert alles, weil -1 alle Bits eingeschaltet hat und 0 alle Bits deaktiviert hat.

(Wie Chris Smith notes, das für eine lange Zeit gilt für verschiedene Aromen von BASIC wurde ...)

Beachten Sie, dass in VB.NET, logische Operatoren (das heißt, Operatoren, die nur betreiben auf Boolesche Datentypen) wurden eingeführt, aber die vorhandenen Operatoren werden immer noch gerne bitweise Operationen ausführen, wenn sie mit integrierten Typen gespeist werden. Dies war eine häufige Quelle der Frustration für mich, wenn ich zwischen C++ und VB ...

ging
+0

Ich weiß :) Ich mag VB nicht;) – Onkelborg

+0

Interessant! Danke für den Link. Ich wusste, dass die logischen Operatoren nicht kurzgeschlossen und bitweise für ganze Zahlen gearbeitet haben, aber ich erkannte nicht, dass sie nur bitweise waren, sogar für Boolesche Werte. Und @Onkelborg, ich mag VB auch nicht, ich war nur neugierig auf diese Anomalie ;-) – Cameron

+1

Gut :) Ther's Hoffnung für die Menschheit :) – Onkelborg

2

Wahr ist als nur binäre Einsen dargestellt (11111111 etc ..), falsch wie nur Nullen (00000 etc ..)

Der Datentyp int unterzeichnet wird, das heißt die msb wenn Null uns sagt, dass der Wert positiv, und wenn einer, dass es negativ ist. Versuchen Sie die größte, mögliche positive Zahl um eins zu überfließen, sie wird dann auf die größtmögliche negative Zahl "überrollen".

Dezimal -1 wird als einzige dargestellt. Da hast du es :)

4

Das stimmt schon lange in Microsoft basic, GW-BASIC zumindest. Ich denke, das liegt daran, dass es zu dieser Zeit keinen booleschen Typ oder einen separaten logischen NOT-Operator gab. Um also den Integer-Operator NOT mit Wahr und Falsch zu arbeiten, verwendeten sie die Werte 0 und -1. Positiv 1 hätte nicht funktioniert, weil NOT 1 nicht Null ist.