2010-10-19 13 views
5

W VB6 przekształcenie True w liczbę całkowitą daje wartość -1.Dlaczego -1 jest wynikiem przymusu True do liczby całkowitej w VB6?

Dlaczego tak się dzieje? Jaki jest tego powód?

W większości innych języków programowania (C/C++, Java, Perl, Python itd.), Wartość true zmienia się na 1, gdy jest wymuszona na liczbę całkowitą. W algebrze boolowskiej wartość 1 jest używana do reprezentowania wartości true/on. Dlaczego VB6 robi to inaczej?

Widzę pewną elegancką symetrię polegającą na tym, że bitowe-nie z -1 (prawda) przyniesie 0 (fałsz), i na odwrót (ponieważ -1 reprezentuje wszystkie 1 w two's complement), ale Nie mogę wymyślić żadnych praktycznych korzyści z tej tożsamości.

Ja tylko pytam z ciekawości, przy okazji - to było coś, co wydało mi się dziwne, kiedy po raz pierwszy poznałem VB6 i od tego czasu się zastanawiam.

Odpowiedz

7

Przyszedłeś bardzo blisko powodu ... Eric Lippert reveals the horrible, horrible truth:

Co się dzieje jest to, że VBScript nie jest logiczne. VBScript jest bitowy. Wszystkie tak zwane operatory logiczne działają na liczbach, a nie na wartościach logicznych! Nie, i, lub, XOr, Eqv i Imp wszystkie przekształcają swoje argumenty w czterobajtowe liczby całkowite, wykonują operację logiczną na każdej parze bitów w liczbach całkowitych i zwracają wynik. Jeśli True wynosi -1, a False wynosi 0, to wszystko działa, ponieważ -1 ma włączone wszystkie bity, a 0 ma wyłączone wszystkie bity.

(Jak Chris Smith notes, to było prawdziwe różnych smaków podstawowych przez długi czas ...)

pamiętać, że w VB.NET, operatory logiczne (czyli podmioty, które działają tylko na Boolean typy danych) zostały wprowadzone, ale istniejący operatorzy nadal będą szczęśliwie wykonywać operacji bitowych, jeśli są zasilane typy integralne. To było częste źródło frustracji podczas przechodzenia między C++ a VB ...

+0

Wiem :) Nie lubię VB;) – Onkelborg

+0

Interesujące! Dzięki za link. Wiedziałem, że operatory logiczne nie uległy zwarciu i działały bitowo dla liczb całkowitych, ale nie zdawałem sobie sprawy, że są one tylko jednokrotne, nawet dla wartości typu Boolean. I @Okkelborg, ja też nie lubię VB, byłem po prostu ciekawy co do tej anomalii ;-) – Cameron

+1

Dobra :) Nadzieja Thera dla ludzkości :) – Onkelborg

2

Prawda jest reprezentowany jako jedyne binarnych (11111111 etc ..), fałszywe jak tylko zerami (00000 etc ..)

Typ danych int jest podpisana, co oznacza, że ​​MSB kiedy zerowa mówi nam, że wartość jest pozytywny, a gdy taki jest negatywny. Spróbuj przelać największą, możliwą liczbę dodatnią o jeden, a następnie "wywrócisz" do największej, możliwej liczby ujemnej.

Dziesiętny -1 jest reprezentowany jako jedyny. Masz to :)

4

Jest to prawdą w firmie Microsoft podstawowej od dłuższego czasu, co najmniej GW-BASIC. Myślę, że dzieje się tak dlatego, że w tamtych czasach nie było rzeczywistego typu boolowskiego lub oddzielnego logicznego operatora NOT, więc aby operator liczb całkowitych NIE pracował z wartością true i false, użyli wartości 0 i -1. Pozytywna 1 nie zadziałałaby, ponieważ NIE 1 nie jest zero.