Basi c Логический вопрос в Excel VBA: вывод -1 - PullRequest
0 голосов
/ 12 марта 2020

True * True * True = -1

Когда я умножаю нечетное число логических переменных на true, результат равен -1. Почему это так?

Разве это не так: ИСТИНА * ИСТИНА * ИСТИНА

так же, как это:

1 * 1 * 1?

Почему vba возвращает -1, а Excel возвращает 1 при оценке этого?

Я использовал такой код для написания

Если Asb (TRUE * TRUE * TRUE) = 1, то ...

или это

Если TRUE * TRUE * TRUE <> 0, то ...

Я хотел бы понять, почему код ведет себя так. Заранее спасибо за объяснение.

Ответы [ 4 ]

0 голосов
/ 12 марта 2020

Вы должны придерживаться -1 и 0 для истинного и ложного. Чтобы подтвердить, что ваш язык использует для true, просто присвойте ноль переменной (false), необязательно быть логическим, затем напечатайте not (variable), чтобы определить, что такое true. Это не работает наоборот, если исходное значение не равно -1. Оператор побитового «не» инвертирует все биты, а «-1» - это двухбитное число, в котором все биты установлены, обнуляют все биты. Если вы присваиваете переменную с любым другим ненулевым числом, использование поразрядного not все равно вернет true при преобразовании в логическое значение.

Один в двоичном коде - пятнадцать нулей и один. Отразите все эти биты, и вы получите пятнадцать, за которыми следует ноль, что является отрицательным значением, поскольку этот первый бит обозначает отрицательное число, но оно не будет отрицательным. Повторное переключение всех битов возвращает его к исходному значению - единице.

Дайте мне знать, если это не ясно.

0 голосов
/ 12 марта 2020

Это может помочь:

Sub test()

    Dim blnTrue As Boolean: blnTrue = True
    Dim blnFalse As Boolean: blnFalse = False

    'True boolean gets any values except 0
    Debug.Print CInt(Int(blnTrue))
    'False boolean gets ONLY 0
    Debug.Print CInt(Int(blnFalse))

    'If you multiple two True boolan you get 1
    MsgBox blnTrue * blnTrue
    'If you multiple two True boolan you get -1
    MsgBox blnTrue * blnTrue * blnTrue

    'The results is always 0
    MsgBox blnFalse * blnFalse
    MsgBox blnFalse * blnFalse * blnFalse

End Sub
0 голосов
/ 12 марта 2020

В Vba Boolean (https://docs.microsoft.com/en-us/dotnet/api/system.boolean?view=netframework-4.8)

False  :  0
True  :  ..., -3,-2.5,-2,-1.5, -1,1.5,2,1.5,3,......

Поскольку Double кроме 0 имеет значение true, код может быть записан в различных форматах, как показано ниже.

Sub testString()
    Dim myBool As Boolean
    Dim str As String
    Dim n As Double

    str = "Mountain"

    n = InStr(str, "t") '<~~ 5
    If InStr(str, "t") > 0 Then
        MsgBox n
    End If

    '** below same
    If InStr(str, "t") Then
        MsgBox n
    End If

    '** below same
    If n Then
        MsgBox n
    End If

End Sub

Булев отладочный тест

enter image description here

0 голосов
/ 12 марта 2020

Логический тип данных Тип данных с двумя возможными значениями: True (-1) или False (0). Булевы переменные хранятся в виде 16-битных (2-байтовых) чисел. См. Сводку типов данных.

https://docs.microsoft.com/en-us/office/vba/language/glossary/vbe-glossary#data -тип

...