Почему -1 является результатом приведения Истина к целому числу в VB6? - PullRequest
6 голосов
/ 20 октября 2010

В VB6 приведение True к целому числу приводит к значению -1.

Почему это так? В чем причина этого?

В большинстве других языков программирования (C / C ++, Java, Perl, Python и т. Д.) Значение true становится равным 1 при приведении к целому числу. В булевой алгебре значение 1 используется для представления true / on. Почему VB6 делает это по-другому?

Я вижу некоторую элегантную симметрию в том факте, что побитовое-не--1 (True) даст 0 (False), и наоборот (из-за того, что -1 представляет все 1 в дополнении до двух) ), но я не могу думать о каких-либо практических преимуществах этой личности.

Кстати, я спрашиваю только из любопытства - это было то, что показалось мне странным, когда я впервые выучил VB6, и с тех пор я удивляюсь.

Ответы [ 3 ]

8 голосов
/ 20 октября 2010

Вы очень близко подошли к причине ... Эрик Липперт раскрывает ужасную, ужасную правду :

Что происходит, так это то, что VBScript не логичен. VBScript является побитовым. Все так называемые логические операторы работают с числами, а не с логическими значениями! Not, And, Or, XOr, Eqv и Imp - все преобразуют свои аргументы в четырехбайтовые целые числа, выполняют логическую операцию над каждой парой битов в целых числах и возвращают результат. Если True равен -1, а False равно 0, то все работает, потому что -1 имеет все свои биты включенными и 0 имеет все свои биты выключенными.

(Как отмечает Крис Смит , это долгое время было верным для различных ароматов Бейсика ...)

Обратите внимание, что в VB.NET были введены логические операторы (то есть операторы, которые работают только на логических типах данных), но существующие операторы по-прежнему будут успешно выполнять побитовые операции, если передаются целочисленные типы. Это было частым источником разочарования для меня при переходе между C ++ и VB ...

2 голосов
/ 20 октября 2010

True представляется только двоичными (11111111 и т. Д.), False - только нулями (00000 и т. Д.)

Тип данных int подписан, это означает, что msb, когда ноль говорит нам, что значение является положительным, а когда оно - отрицательным. Попробуйте переполнить наибольшее возможное положительное число на единицу, затем оно «перевернется» до наибольшего возможного отрицательного числа.

Десятичный знак -1 представлен только как один. Вот оно:)

...