vb.net - число - разница между int и system int32




Задание логического значения для целого числа возвращает-1 для true? (6)

Документация MSDN дает некоторую ценную информацию:

Булевы значения не сохраняются как числа, а сохраненные значения не должны быть эквивалентны номерам. Вы никогда не должны писать код, который полагается на эквивалентные числовые значения для True и False. Когда это возможно, вы должны ограничить использование логических переменных логическими значениями, для которых они созданы.

Я работаю с некоторым кодом VB.NET который, кажется, CInt(myBoolean) логическое значение целого с помощью CInt(myBoolean) . Странная вещь, которая происходит, состоит в том, что она возвращает -1, если значение истинно. Например:

CInt(True)  // returns -1
CInt(False) // returns 0

Это распространено на других языках?

Я думал, что логическое значение будет 1, если true, и 0, если false. Кроме того, есть ли способ сделать Visual Basic назначить 1 вместо true, а не назначать -1?


Многие версии BASIC в 1970-х и 1980-х годах реализовали бит-мутную арифметику со своими операторами AND и OR и сделали истинное условное выражение для оценки -1 (что было значением «все бит-множество»). Я точно не знаю, почему было принято решение о том, чтобы истинные условные выражения оценивали значение, установленное для всех бит; возможность использовать AND для маскировки целого числа в условном выражении, возможно, была быстрее, чем умножение, но, учитывая тогда внутреннюю механику интерпретаторов, разница была бы незначительной.

В любом случае первые версии BASIC, выпущенные Microsoft для ПК, следуют в той традиции, когда истинные условные выражения оцениваются в -1 (набор всех бит); поскольку QuickBASIC, в свою очередь, должен был быть совместим с ними, и Visual Basic должен был быть совместим с QuickBASIC, они использовали одно и то же представление. Хотя .Net распознает целые числа и булевы как разные типы, vb.net хотел предложить путь миграции для VB6-программ, которые могут опираться на прежнее поведение. С «Option Strict Off», VB.Net будет неявно преобразовывать логическое значение True в целое число -1; в то время как большинство программистов используют Option Strict On , CInt() чтобы поведение CInt() отличалось от поведения неявного преобразования.


Обычно значение false представляется равным 0, а значение true представлено любым значением, отличным от 0. Специфическое значение true и false (среди прочих) - это то, на что вы не должны полагаться - они потенциально могут быть специфичными для реализации. Я не уверен, что вы пытаетесь сделать, но, вероятно, было бы лучше не полагаться на True или False имея какие-либо конкретные целочисленные значения, если вам не обязательно.

Лучшее объяснение, которое я мог найти для конкретного поведения VB, происходит из Wikipedia :

Булева константа True имеет числовое значение -1. Это связано с тем, что тип данных Boolean хранится как 16-разрядное целое число со знаком. В этой конструкции -1 вычисляется 16 двоичных 1s (логическое значение True) и 0 как 16 0s (логическое значение False). Это очевидно при выполнении операции «Не» в 16-битовом значении целочисленного значения 0, которое вернет целочисленное значение -1, другими словами True = Not False. Эта неотъемлемая функциональность становится особенно полезной при выполнении логических операций над отдельными битами целого числа, таких как And, Or, Xor и Not. [4] Это определение True также совместимо с BASIC с начала 1970-х годов Microsoft BASIC, а также связано с характеристиками инструкций CPU в то время.


Похоже на получение, и я не знаю других примеров такого поведения.

msdn.microsoft.com/en-us/library/ae382yt8.aspx указывает это поведение, с этим замечанием «Не делайте этого, mkay». Делайте заметку ниже:

Преобразование в рамки

Метод ToInt32 класса Convert в пространстве имен System преобразует True в +1.

Если вы должны преобразовать логическое значение в числовой тип данных, будьте осторожны с тем, какой метод преобразования вы используете.


У меня была та же проблема и я использовал функцию Math.Abs на результат :)


У меня была такая же проблема с MySQL, как у этого типа Boolean только tinyint (1).

Моим решением было написать функцию конвертера, чтобы убедиться, что значения верны, прежде чем вставлять их в базу данных

        Public Function BoolToMySql(bVal As Boolean) As Integer
            Dim retVal As Integer
            If bVal = True Then
                retVal = 1
            Else
                retVal = 0
            End If
                 BoolToMySql = retVal
        End Function




boolean