Страницы: 1
RSS
Почему True = -1?
 
Добрый день всем!

Целый день убил на поиск ошибки в коде, пока не понял, что булевское True считается равным -1.
Почему так? Я всегда считал, что True = 1, поэтому просто использовал значение булевской переменной в вычислениях.
Ниже привожу простой пример, который в результате выдаёт -1.
Код
Sub test()
Dim n As Boolean
Dim m as Integer
n = True
m = 1
MsgBox (n * m)
End Sub

Объясните, пожалуйста, почему результат с минусом. Проверено на Excel 2010 и Excel 2013. То, что можно заводить дополнительные переменные или ветки по условиям, я понимаю, но меня интересует сам факт отрицательного True.

Изменено: Vetermsk - 19.06.2017 09:18:30
 
True не обязательно равняется 1, False = 0, а True = Not False, т.е. оно может быть и 1, и -1
 
уберите пустые строки,
код оформите тегом <...>,
ответ на ваш вопрос есть в справке MSDN
... оставлю линк  ;)
- пока не оформите свой пост Нормально - претензии у модераторов могут появиться и к вам и ко мне (если отвечу на такую постановку вопроса как ваша)
Изменено: JeyCi - 19.06.2017 09:15:08
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
пока не оформите свой пост Нормально
Так хорошо?
 
:) хорошо...
обратите внимание на Преобразование типов .. делая умножение (арифметическое действие) - вы неявно преобразовываете переменную в числовой формат... преобразовывается в -1 ... такова жизнь
Цитата
Когда Visual Basic преобразует значения Boolean в числовые типы, False становится 0, а True становится -1.
Изменено: JeyCi - 19.06.2017 09:24:47
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
а преобразовывается в -1 ... такова жизнь
С ума сойти :)
Спасибо Вам!
 
По поводу совместимости False и 0 вопросов, видимо, не возникает...  :D
А для общего понимания запустите код:
Код
For i = -3 To 3
  j = Not i
  MsgBox "i = " & i & vbCrLf & "j = " & j
Next
 
Цитата
AAF написал:
для общего понимания
Вот понимания мне это точно не добавило :)
Но зато больше ни за что не буду использовать булевские переменные в вычислениях.
 
Цитата
Vetermsk написал:
не буду использовать булевские
Значит что-то добавило... ;)
Смотря что вычислять...
 
В недрах интернета есть ответ ZVI на вопрос VBA True = -1?
Алексей М.
 
Цитата
Vetermsk написал:
больше ни за что не буду использовать булевские переменные в вычислениях
И зря!
 
В литературе встречал утверждение, что VBA интерпретирует значение True как -1, а False как 0.
 
Цитата
Юрий М написал:
И зря!
Почему зря?
Я, конечно, в текущей программе просто беру результат вычисления по модулю, но, вдруг, в дальнейшем MS изменит интерпретацию True? И будет 1, а не -1? А я забуду про модуль.
Изменено: Vetermsk - 19.06.2017 10:51:20
 
Доброе время суток.
Цитата
Юрий М написал:
Vetermsk  написал:
больше ни за что не буду использовать булевские переменные в вычисленияхИ зря!
А вот и не зря. Не стоит смешивать мелкое с мягким, если только вы не пишете какую-нибудь систему реального времени, где каждая микросекунда сэкономленных вычислений дорога. Boolean для логики, вот и используем только для неё. В C# true - это 1.
 
Узнаем значение Труя с помощью конструкции Труя = Not 0 и потом спокойно применяем не спотыкаясь....
 
Андрей, так я про это и говорю в ответ на категоричное "больше ни за что не буду использовать" ))
Цитата
Vetermsk написал:
вдруг, в дальнейшем MS изменит интерпретацию True? И будет 1, а не -1? А я забуду про модуль.
А Вы используйте не константу, а True/False
И ведь можно ещё так проверять, без явного указания состояния переменной - Истина или Ложь
Код
Sub Test()
Dim x As Boolean
    If x Then
        MsgBox "Ага )"
    Else
        MsgBox "Неа"
    End If
End Sub
 
А вот по поводу совместимости:
Код
Sub BoolCompatibility()
Dim vBool As Boolean, vByte As Byte, vInt As Integer, vStr As String
vBool = True
vByte = vBool
vInt = vBool
vStr = vBool
MsgBox "vBool = " & vBool & vbCrLf & "vByte = " & vByte & vbCrLf & "vInt = " & vInt & vbCrLf & "vStr = " & vStr
For vByte = 0 To 3
  MsgBox Not vByte
Next
End Sub
Изменено: AAF - 19.06.2017 11:19:38
Страницы: 1
Читают тему
Наверх