Основной логический вопрос в Excel VBA: вывод -1

Верно * Верно * Верно = -1

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

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

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

1 * 1 * 1?

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

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

Если Asb(ИСТИНА * ИСТИНА * ИСТИНА) = 1, то...

или это

Если ИСТИНА * ИСТИНА * ИСТИНА ‹> 0, то...

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


person akcramblet    schedule 12.03.2020    source источник
comment
В VBA True буквально определяется как -1, а False буквально определяется как 0.   -  person Excel Hero    schedule 12.03.2020
comment
Например, в окне Immediate редактора VB Editor попробуйте следующее: Правда -1 и еще? Ложь -1   -  person Excel Hero    schedule 12.03.2020
comment
Просто из любопытства: зачем вам умножать логическое значение?   -  person FunThomas    schedule 12.03.2020


Ответы (3)


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

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

person luizinhoab    schedule 12.03.2020
comment
comment
Спасибо. Я бы предпочел, чтобы значение true было равно 1. Спасибо за разъяснение. Любая идея, почему в Excel, если я умножу 3 истинных логических значения, результат будет (1), а не (-1)? - person akcramblet; 12.03.2020
comment
Excel рассматривает значение 0 как ложное, а любое другое числовое значение — как истинное. - person luizinhoab; 12.03.2020

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

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

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

person Bill Hileman    schedule 12.03.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

Булев тест отладки

введите здесь описание изображения

person Dy.Lee    schedule 12.03.2020